回表查詢的說明


你可能從來都沒有聽說過回表一詞,但是你在實際工作中肯定用過回表。如果還沒有聽過回表,那我相信不管你看多少 SQL 優化的知識,都還只是停留在表面。即使你參考學習過我前面的這篇文章《MySQL 性能優化神器 Explain 使用教程》。

一條SQL語句的查詢過程

我們先來看看什么是回表?

通俗的講就是,如果索引的列在 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'),
    (2, 1, '業余草'),
    (3, 3, '業余草公眾號');

假設,現在我們要查詢出 id 為 2 的數據。那么執行 select * from xttblog where ID = 2; 這條 SQL 語句就不需要回表。原因是根據主鍵的查詢方式,則只需要搜索 ID 這棵 B+ 樹。主鍵是唯一的,根據這個唯一的索引,MySQL 就能確定搜索的記錄。

但當我們使用 k 這個索引來查詢 k = 2 的記錄時就要用到回表。select * from xttblog where k = 2; 原因是通過 k 這個普通索引查詢方式,則需要先搜索 k 索引樹,然后得到主鍵 ID 的值為 1,再到 ID 索引樹搜索一次。這個過程雖然用了索引,但實際上底層進行了兩次索引查詢,這個過程就稱為回表。

也就是說,基於非主鍵索引的查詢需要多掃描一棵索引樹。因此,我們在應用中應該盡量使用主鍵查詢。

我這里表里的數據量比較少,如果數據量大的話,你能很明顯的看出兩次查詢所用的時間,很明顯使用主鍵查詢效率更高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM