2020-07-12:什么是索引回表,如何避免?

4年前 (2021-06-07)閱讀868回復0
超市單頁(yè)
超市單頁(yè)
  • 管理員
  • 發(fā)消息
  • 注冊排名703
  • 經(jīng)驗值40
  • 級別管理員
  • 主題8
  • 回復0
樓主

首先,數據庫中的索引是什么?

引用高性能mysql中的一句話(huà):索引(mysql也叫作鍵(key))是存儲引擎用于快速找到記錄的一種數據結構。

2020-07-12:什么是索引回表,如何避免?

這句話(huà)有兩個(gè)點(diǎn):存儲引擎和數據結構。首先理解索引是在存儲引擎層而非服務(wù)器層實(shí)現。而mysql分為多種存儲引擎,這里我們只探討myisam 和InnoDB。兩者都支持B+Tree(一種數據結構)索引。

如果說(shuō)這個(gè)理解不了,還有一個(gè)通俗易懂的方法。書(shū)都有目錄,快速找到自己需要內容的方法,就是查看目錄,索引就是數據庫表數據的目錄。

2020-07-12:什么是索引回表,如何避免?

回歸問(wèn)題:索引引發(fā)的回表問(wèn)題。索引為啥會(huì )引發(fā)回表?

下面我們來(lái)假設一種情況,一個(gè)表有三個(gè)字段 ID ,name ,age,將ID設置成主鍵索引,name設成輔助索引。

然后來(lái)看一下下面的sql:

1.select * from t where id='5';

2.select * from t where name='張三';

兩個(gè)很簡(jiǎn)單的Sql。

第一個(gè)sql不用說(shuō),直接通過(guò)主鍵索引,從樹(shù)上直接可以得到結果。

第二個(gè)sql:首先name,mysql并不能得到所有列的信息(也就是*),只能得到主鍵ID,然后會(huì )根據ID在進(jìn)行二次查詢(xún),這就引發(fā)了回表問(wèn)題。這就是為啥不能使用*的原因。

那么怎么解決呢?

第一不要寫(xiě)*。

第二利用組合索引,也就是說(shuō)你根據業(yè)務(wù)實(shí)際需要,將需要的字段形成組合索引。

0
0
收藏0
回帖

2020-07-12:什么是索引回表,如何避免? 期待您的回復!

取消
載入表情清單……
載入顏色清單……
插入網(wǎng)絡(luò )圖片

取消確定

圖片上傳中
編輯器信息
提示信息