MySQL 回表

haodudecao發表於2021-10-07

什麼是回表?

簡單來說就是資料庫根據索引(非主鍵)找到了指定的記錄所在行後,還需要根據索引上儲存的主鍵 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 協議》,轉載必須註明作者和本文連結
我未曾珍惜的,我不再擁有?‍?️

相關文章