什麼是回表?
簡單來說就是資料庫根據索引(非主鍵)找到了指定的記錄所在行後,還需要根據索引上儲存的主鍵 ID 再次到資料塊裡獲取資料。
table-access-by-index-rowid
「回表」一般就是指執行計劃裡顯示的 「TABLE ACCESS BY INDEX ROWID」。
再例如,雖然只查詢索引裡的列,但是需要回表過濾掉其他行。
在 InnoDB 裡,索引 B+ Tree 的葉子節點儲存了整行資料的是主鍵索引,也被稱之為聚簇索引。而索引 B+ Tree 的葉子節點儲存了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引。
如何避免回表
將需要的欄位放在索引中去,查詢的時候就能避免回表。
科普時間——覆蓋索引
覆蓋索引(covering index)指一個查詢語句的執行只用從索引中就能夠取得,不必從資料表中讀取。也可以稱之為實現了索引覆蓋。當一條查詢語句符合覆蓋索引條件時,MySQL 只需要透過索引就可以返回查詢所需要的資料,這樣避免了查到索引後再返回表操作,減少 I/O 提高效率。例如:
表 covering_index_sample
中有一個聯合索引 idx_key1_key2(key1,key2)
當我們透過SQL語句:
select key2 from covering_index_sample where key1 = 'keytest';
進行查詢的時候,就可以透過覆蓋索引查詢,無需回表。
本作品採用《CC 協議》,轉載必須註明作者和本文連結