首頁 > 軟體

mysql回表查詢是什麼,回表查詢的使用

2022-11-23 14:02:18

在說到什麼是回表查詢的時候,有兩個概念需要先解釋清楚:分別是聚集索引(聚簇索引)和非聚集索引(非聚簇索引)

聚集索引和非聚集索引

MySQL規定,在使用InnoDB儲存引擎的時候,必須且僅有一個聚集索引,非聚集索引也就是普通索引就看自己設定的有多少個了

聚集索引和非聚集索引的區別

1.聚集索引中的非葉子節點儲存的是表的主鍵,非聚集索引的非葉子節點儲存的是自己設定的索引欄位對應的值(如果是聯合索引,那就是聯合索引的幾個欄位對應的值)

2.聚集索引的葉子節點,儲存著當前表中每條記錄的所有資訊;非聚集索引的葉子節點,只儲存當前記錄對應的主鍵ID(也就是聚集索引的非葉子節點儲存的值)

下面這張圖是在網上找的一張截圖

大致就是這個意思:左邊的是主鍵索引(聚集索引),右邊的是普通索引(非聚集索引)

那回表是什麼

如果是通過非主鍵索引進行查詢,select所要獲取的欄位不能通過非主鍵索引獲取到,需要通過非主鍵索引獲取到的主鍵,從聚集索引再次查詢一遍,獲取到所要查詢的記錄,這個查詢的過程就是回表

  • 通過執行計劃的Extra欄位的值,可以看到當前sql是否進行了回表
  • 如果Extra欄位值為null,我不太確定是否是一定走回表的(待確認)
  • 但是如果Extra為Using index,則表示當前查詢,通過索引覆蓋就可以獲取到當前select要的值,無需通過回表查詢記錄

驗證

create TABLE hui_biao_test (id int not null auto_increment,name varchar(20),age int(11),first_name varchar(20),CONSTRAINT pk_id PRIMARY KEY(id));
create index index_name on `hui_biao_test`(name);

這是我的sql,建立了一張表,

explain select id,name from `hui_biao_test` where name = '張三';
explain select name from `hui_biao_test` where name = '張三';
explain select name,age from `hui_biao_test` where name = '張三';

下面截圖分別是這三個sql的執行計劃,可以發現:

第一個sql和第二個sql的Extra是Using index,說明前兩個sql是索引覆蓋,無需回表即可查詢到當前要用的資料;

但是第三個sql就不可以,因為有一個age欄位,在name這個索引中,沒有age欄位的資訊,只有id和name(name索引對應的B+樹中的非葉子節點就是name欄位的值,id就是葉子節點儲存的元素),所以需要通過回表,去主鍵索引查詢到對應的記錄,然後獲取到對應的age屬性

假如說我把name和age設定為聯合索引,那最後一個sql的執行計劃就會有變化

可以看到,這個sql的執行計劃中Extra就是Using index

說明當前聯合索引的非葉子節點中,儲存的是聯合索引對應的資訊;僅通過聯合索引就可以獲取到select所需要的資訊,這樣,就無須再經過主鍵索引查詢了

所以,這就是回表的概念

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com