什么是回表查詢

前置知識點(diǎn)
索引數(shù)據(jù)結(jié)構(gòu)
mysql主要有兩大索引:B-tree索引和hash索引,注意一個誤區(qū),這個不叫B減樹,B樹就是B樹,B+樹就是B+樹,沒有所謂的B減樹,那個 - 是連接符號

索引實現(xiàn)
hash索引的底層就是一張哈希表,根據(jù)key的hash值查找值,因此無論有多少條數(shù)據(jù),查找的時間復(fù)雜度都為O(1),但是如果有排序查詢,時間復(fù)雜度會從O(1)退化到O(n);而樹形結(jié)構(gòu)永遠(yuǎn)都是O(log(n));

索引類型
mysql的所有分為聚集索引和非聚集索引

mysql引擎

MyISAM:
B+Tree葉節(jié)點(diǎn)存放的是數(shù)據(jù)記錄的地址,在檢索的時候,先找到索引對應(yīng)的數(shù)據(jù)記錄的地址,再根據(jù)地址讀取相應(yīng)的數(shù)據(jù)記錄,這種查找方式被稱為“非聚集索引”。
InnoDB:
它的主鍵索引是聚集索引,即主鍵和行記錄放在同一個葉節(jié)點(diǎn),找到了主鍵也就找到了行記錄;而它的非主鍵索引,或者說是輔助索引,是非聚集索引,跟MyISAM引擎的非聚集索引不同的是,MyISAM葉節(jié)點(diǎn)保存的是地址,而InnoDB是主鍵,InnoDB非聚集索引的索引文件和數(shù)據(jù)文件分開存儲,索引文件的葉節(jié)點(diǎn)只保存主鍵,在查找時,要先找到葉節(jié)點(diǎn)中的主鍵,再根據(jù)主鍵去主索引文件查找詳細(xì)行記錄;因此,在設(shè)計表的時候,主鍵字段不宜過長。
回表查詢
上述InnoDB引擎中,非主鍵索引查找數(shù)據(jù)時需要先找到主鍵,再根據(jù)主鍵查找具體行數(shù)據(jù),這種現(xiàn)象叫回表查詢

如何避免
索引覆蓋,即將查詢sql中的字段添加到聯(lián)合索引里面,只要保證查詢語句里面的字段都在索引文件中,就無需進(jìn)行回表查詢;

比方說有個用戶表,有id、name、age、addr四個字段,其中id為主鍵,主鍵自帶主鍵索引,無需創(chuàng)建
值1:1、小張、18、成都;
值2:2、小黃、20、北京;

select * from table_t where name = "小張"
1
這種查詢就必須先在索引文件中找到name為小張的索引節(jié)點(diǎn),很明顯這個節(jié)點(diǎn)里面只有id,因為這張表只有主鍵索引,再根據(jù)id去數(shù)據(jù)文件查找具體數(shù)據(jù)

如果把name、age、addr建立到聯(lián)合索引,在找到name為小張的索引節(jié)點(diǎn)時,發(fā)現(xiàn)里面已經(jīng)有了我們所需要的age、addr,就無需再到數(shù)據(jù)文件查找;

當(dāng)然實際開發(fā)中,不可能把所有字段建立到聯(lián)合索引,應(yīng)根據(jù)實際業(yè)務(wù)場景,把經(jīng)常需要查詢的字段建立到聯(lián)合索引即可。
————————————————
版權(quán)聲明:本文為CSDN博主「負(fù)債程序猿」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_33709582/article/details/113780549

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容