mysql回表查詢是什么,回表查詢的使用
在說到什么是回表查詢的時候,有兩個概念需要先解釋清楚:分別是聚集索引(聚簇索引)和非聚集索引(非聚簇索引)
聚集索引和非聚集索引
MySQL規(guī)定,在使用InnoDB存儲引擎的時候,必須且僅有一個聚集索引,非聚集索引也就是普通索引就看自己設(shè)置的有多少個了
聚集索引和非聚集索引的區(qū)別
1.聚集索引中的非葉子節(jié)點存儲的是表的主鍵,非聚集索引的非葉子節(jié)點存儲的是自己設(shè)置的索引字段對應(yīng)的值(如果是聯(lián)合索引,那就是聯(lián)合索引的幾個字段對應(yīng)的值)
2.聚集索引的葉子節(jié)點,存儲著當(dāng)前表中每條記錄的所有信息;非聚集索引的葉子節(jié)點,只存儲當(dāng)前記錄對應(yīng)的主鍵ID(也就是聚集索引的非葉子節(jié)點存儲的值)
下面這張圖是在網(wǎng)上找的一張截圖
大致就是這個意思:左邊的是主鍵索引(聚集索引),右邊的是普通索引(非聚集索引)
那回表是什么
如果是通過非主鍵索引進行查詢,select所要獲取的字段不能通過非主鍵索引獲取到,需要通過非主鍵索引獲取到的主鍵,從聚集索引再次查詢一遍,獲取到所要查詢的記錄,這個查詢的過程就是回表
- 通過執(zhí)行計劃的Extra字段的值,可以看到當(dāng)前sql是否進行了回表
- 如果Extra字段值為null,我不太確定是否是一定走回表的(待確認(rèn))
- 但是如果Extra為Using index,則表示當(dāng)前查詢,通過索引覆蓋就可以獲取到當(dāng)前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,創(chuàng)建了一張表,
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的執(zhí)行計劃,可以發(fā)現(xiàn):
第一個sql和第二個sql的Extra是Using index,說明前兩個sql是索引覆蓋,無需回表即可查詢到當(dāng)前要用的數(shù)據(jù);
但是第三個sql就不可以,因為有一個age字段,在name這個索引中,沒有age字段的信息,只有id和name(name索引對應(yīng)的B+樹中的非葉子節(jié)點就是name字段的值,id就是葉子節(jié)點存儲的元素),所以需要通過回表,去主鍵索引查詢到對應(yīng)的記錄,然后獲取到對應(yīng)的age屬性
假如說我把name和age設(shè)置為聯(lián)合索引,那最后一個sql的執(zhí)行計劃就會有變化
可以看到,這個sql的執(zhí)行計劃中Extra就是Using index
說明當(dāng)前聯(lián)合索引的非葉子節(jié)點中,存儲的是聯(lián)合索引對應(yīng)的信息;僅通過聯(lián)合索引就可以獲取到select所需要的信息,這樣,就無須再經(jīng)過主鍵索引查詢了
所以,這就是回表的概念
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql 發(fā)生系統(tǒng)錯誤1067的解決方法
今天要把WEB項目打包成EXE,可是在數(shù)據(jù)庫上卡住了。在啟動數(shù)據(jù)庫服務(wù)的時候發(fā)生系統(tǒng)錯誤 1067。2009-09-09最新版MySQL 8.0.22下載安裝超詳細(xì)教程(Windows 64位)
這篇文章主要介紹了最新版MySQL 8.0.22下載安裝超詳細(xì)教程(Windows 64位),本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12MySQL過濾重復(fù)數(shù)據(jù)的兩種方法示例
數(shù)據(jù)庫生成環(huán)境中經(jīng)常會遇到表中有重復(fù)的數(shù)據(jù),或者進行關(guān)聯(lián)過程中產(chǎn)生重復(fù)數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MySQL過濾重復(fù)數(shù)據(jù)的兩種方法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Mysql數(shù)據(jù)庫如何使用DELETE語句從數(shù)據(jù)庫表中刪除數(shù)據(jù)(數(shù)據(jù)庫數(shù)據(jù)刪除)
DELETE語句是SQL中的一個重要功能,允許用戶根據(jù)特定條件刪除表中的數(shù)據(jù)行,在本文中,我們探討了如何使用DELETE語句從數(shù)據(jù)庫表中刪除數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧2024-08-08解決Mysql建表時報錯invalid?ON?UPDATE?clause?for?'create_d
這篇文章主要介紹了解決Mysql建表時報錯invalid?ON?UPDATE?clause?for?'create_date'?column問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12