一文解答什麼是MySQL的回表
引言
簡單來說,回表就是 MySQL 要先查詢到主鍵索引,然後再用主鍵索引定位到數據。
下面,對一些問題進行分析與回答:
- 什麼是聚簇索引?什麼是非聚簇索引?
- 為什麼回表要先查到主鍵索引?
- 主鍵索引和非主鍵索引有什麼區別?
- 如何避免回表?
聚簇索引和非聚簇索引是什麼?
MySQL 的索引有不同的角度的分類方式,例如:按數據結構分、按邏輯角度分、按物理存儲分。
其中,按物理存儲分有兩種索引:聚簇索引和非聚簇索引。
簡單來說,聚簇索引是主鍵索引。
主鍵索引之外的就是非聚簇索引,非聚簇索引又叫輔助索引或者二級索引。
主鍵索引和非主鍵索引有什麼區別?
相同點:都使用的是 B+Tree 。
不同點:葉子節點存儲的數據不同
- 主鍵索引的葉子節點存儲的是一行完整的數據;
- 非主鍵索引的葉子節點存儲的是主鍵值。葉子節點不包含記錄的全部數據,非主鍵的葉子節點除瞭用來排序的 key 還包含一個書簽(bookmark),其中存儲瞭聚簇索引的 key。
那麼這兩種索引在使用方面上有什麼區別呢?
使用主鍵索引查詢:
# 主鍵索引的的葉子節點存儲的是**一行完整的數據**, # 所以隻需搜索主鍵索引的 B+Tree 就可以輕松找到全部數據 select * from user where id = 1;
使用非主鍵索引查詢:
# 非主鍵索引的葉子節點存儲的是**主鍵值**, # 所以MySQL會先查詢到 name 列的索引的 B+Tree,搜索得到對應的主鍵值 # 然後再去搜索該主鍵值查詢主鍵索引的 B+Tree 才可以找到對應的數據 select * from user where name = 'Jack';
可以看出使用非主鍵索引要比主鍵索引多使用一次 B+Tree。
B-Tree 和 B+Tree 的簡單理解
理解聚簇索引和非聚簇索引的關鍵在於 B+Tree 的理解。
用一幅圖來表示,其它的就不再過多解釋瞭:
這裡隻是簡單介紹一下 B-Tree 和 B+Tree 的區別:
- B+樹中隻有葉子節點會帶有指向記錄的指針,而B樹則所有節點都帶有,在內部節點出現的索引項不會再出現在葉子節點中。
- B+樹中所有葉子節點都是通過指針連接在一起,而B樹不會。
如何避免回表?
使用覆蓋索引,所謂覆蓋索引就是指索引中包含瞭查詢中的所有字段,這種情況下就不需要再進行回表查詢瞭。
到此這篇關於一文解答什麼是MySQL的回表的文章就介紹到這瞭,更多相關MySQL回表內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MySQL進階之索引
- 一看就懂的MySQL的聚簇索引及聚簇索引是如何長高的
- MySQL中B樹索引和B+樹索引的區別詳解
- MySQL學習之索引及優化
- mysql查詢條件not in 和 in的區別及原因說明