通俗的講就是,如果索引的列在 select 所需獲得的列中(因為在 mysql 中索引是根據索引列的值進行排序的,所以索引節點中存在該列中的部分值)或者根據一次索引查詢就能獲得記錄就不需要回表,如果 select 所需獲得列中有大量的非索引列,索引就需要到表中找到相應的列的資訊,這就叫回表。
根據這個概念,當你使用 explain 執行查詢計畫時,當結果中 extra 出現了 using index、using where、using index condition 等你就認為使用了過濾條件,使用了索引,sql 優化的還不錯。這其實是一種錯誤的認識。
因為,使用了索引並不代表查詢就最優。從 using index condition、using index & using where 等可以看出,這條 sql 語句其實是進行了回表的。
還有些時候,你檢視 explain 執行計畫後,發現明明走了索引,為什麼還是慢?這裡面可能就是存在回表了。下面我們通過乙個例子來說明什麼是回表。先建立一張表,sql 語句如下:
create table xttblog(
id int primary key,
k int not null,
name varchar(16),
index (k)
)engine = innodb;
然後,我們再執行下面的 sql 語句,插入幾條測試資料。
insert into xttblog(id, k, name) values(1, 2, 'xttblog'),假設,現在我們要查詢出 id 為 2 的資料。那麼執行 select * from xttblog where id = 2; 這條 sql 語句就不需要回表。原因是根據主鍵的查詢方式,則只需要搜尋 id 這棵 b+ 樹。主鍵是唯一的,根據這個唯一的索引,mysql 就能確定搜尋的記錄。(2, 1, '業餘草'),
但當我們使用 k 這個索引來查詢 k = 2 的記錄時就要用到回表。select * from xttblog where k = 2; 原因是通過 k 這個普通索引查詢方式,則需要先搜尋 k 索引樹,然後得到主鍵 id 的值為 1,再到 id 索引樹搜尋一次。這個過程雖然用了索引,但實際上底層進行了兩次索引查詢,這個過程就稱為回表。
也就是說,基於非主鍵索引的查詢需要多掃瞄一棵索引樹。因此,我們在應用中應該盡量使用主鍵查詢。
mysql 回表 什麼是MYSQL回表查詢
select id,name where name shenjian select id,name,where name shenjian 多查詢了乙個屬性,為何檢索過程完全不同?什麼是回表查詢?什麼是索引覆蓋?如何實現索引覆蓋?哪些場景,可以利用索引覆蓋來優化sql?這些,這是今天要分享的內容。畫...
mysql 回表查詢是什麼
在說到什麼是回表查詢的時候,有兩個概念需要先解釋清楚 分別是聚集索引 聚簇索引 和非聚集索引 非聚簇索引 mysql規定,在使用innodb儲存引擎的時候,必須且僅有乙個聚集索引,非聚集索引也就是普通索引就看自己設定的有多少個了 聚集索引和非聚集索引的區別 1.聚集索引中的非葉子節點儲存的是表的主鍵...
MySQL的回表查詢與索引覆蓋查詢
上篇講到,mysql中分為聚集索引和非聚集索引。非聚集索引的btree葉子節點中儲存的是當行資料的pk。所以為了取到具體資料,則需要通過pk回到聚集索引裡去查詢資料。著就叫回表查詢。掃瞄了2次索引樹。所以效率相對較低。假設有個t表,如下圖所示。id是聚集索引,name則是普通索引。idname 1小...