mysql 回表查詢是什麼

2021-10-09 18:57:44 字數 1971 閱讀 7043

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

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所需要的資訊,這樣,就無須再經過主鍵索引查詢了

所以,這就是回表的概念

mysql 回表 什麼是MYSQL回表查詢

select id,name where name shenjian select id,name,where name shenjian 多查詢了乙個屬性,為何檢索過程完全不同?什麼是回表查詢?什麼是索引覆蓋?如何實現索引覆蓋?哪些場景,可以利用索引覆蓋來優化sql?這些,這是今天要分享的內容。畫...

mysql回表查詢

通俗的講就是,如果索引的列在 select 所需獲得的列中 因為在 mysql 中索引是根據索引列的值進行排序的,所以索引節點中存在該列中的部分值 或者根據一次索引查詢就能獲得記錄就不需要回表,如果 select 所需獲得列中有大量的非索引列,索引就需要到表中找到相應的列的資訊,這就叫回表。根據這個...

什麼是Mysql 的「回表」

自 感謝大佬分享。小夥伴們在面試的時候,有乙個特別常見的問題,那就是資料庫的回表。什麼是回表?為什麼需要回表?對於第一點,乙個 b tree 可以存多少條資料呢?以主鍵索引的 b tree 為例 二級索引儲存資料量的計算原理類似,但是葉子節點和非葉子節點上儲存的資料格式略有差異 我們可以簡單算一下。...