2020-07-12:什么是索引回表,如何避免?
首先,數據庫中的索引是什么?
引用高性能mysql中的一句話(huà):索引(mysql也叫作鍵(key))是存儲引擎用于快速找到記錄的一種數據結構。
這句話(huà)有兩個(gè)點(diǎn):存儲引擎和數據結構。首先理解索引是在存儲引擎層而非服務(wù)器層實(shí)現。而mysql分為多種存儲引擎,這里我們只探討myisam 和InnoDB。兩者都支持B+Tree(一種數據結構)索引。
如果說(shuō)這個(gè)理解不了,還有一個(gè)通俗易懂的方法。書(shū)都有目錄,快速找到自己需要內容的方法,就是查看目錄,索引就是數據庫表數據的目錄。
回歸問(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í)際需要,將需要的字段形成組合索引。