欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文弄懂什么是MySQL的回表

 更新時(shí)間:2023年06月06日 10:16:20   作者:逆流°只是風(fēng)景-bjhxcc  
本文主要介紹了一文弄懂什么是MySQL的回表,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、背景

先要從 InnoDB 的索引實(shí)現(xiàn)說(shuō)起,InnoDB 有兩大類(lèi)索引:

  • 聚集索引 (clustered index)
  • 普通索引 (secondary index)

InnoDB 聚集索引和普通索引有什么差異?

InnoDB 普通索引 的葉子節(jié)點(diǎn)存儲(chǔ)主鍵值。

注意:只有 InnoDB 普通索引才存儲(chǔ)主鍵值,MyISAM 的二級(jí)索引都是直接指向數(shù)據(jù)塊的。

InnoDB 聚集索引 的葉子節(jié)點(diǎn)存儲(chǔ)行記錄,因此,InnoDB 必須要有,且只有一個(gè)聚集索引:

如果表定義了主鍵,則主鍵就是聚集索引;

如果表沒(méi)有定義主鍵,則第一個(gè) not null 的 unique 列是聚集索引;

否則,InnoDB 會(huì)創(chuàng)建一個(gè)隱藏的 row-id 作為聚集索引;

注意:所以主鍵查詢(xún)非常快,直接定位行記錄。

二、什么是回表查詢(xún)?

通俗的講就是,如果索引的列在 select 所需獲得的列中(因?yàn)樵?mysql 中索引是根據(jù)索引列的值進(jìn)行排序的,所以索引節(jié)點(diǎn)中存在該列中的部分值)或者根據(jù)一次索引查詢(xún)就能獲得記錄就不需要回表,如果 select 所需獲得列中有大量的非索引列,索引就需要到表中找到相應(yīng)的列的信息,這就叫回表。

InnoDB聚集索引的葉子節(jié)點(diǎn)存儲(chǔ)行記錄,因此, InnoDB必須要有,且只有一個(gè)聚集索引:

(1)如果表定義了主鍵,則PK就是聚集索引;
(2)如果表沒(méi)有定義主鍵,則第一個(gè)非空唯一索引(not NULL unique)列是聚集索引;
(3)否則,InnoDB會(huì)創(chuàng)建一個(gè)隱藏的row-id作為聚集索引;

三、可以舉一個(gè)簡(jiǎn)單的例子

我有一張用于用戶(hù)登錄的user表:

字段名類(lèi)型說(shuō)明
idbigint(20)主鍵ID
usernamevarchar(20)用戶(hù)名
passwordvarchar(20)密碼

假如現(xiàn)在有一個(gè)用戶(hù)名為admin,密碼為123的用戶(hù)要登錄,那我會(huì)先找出username為admin的那條用戶(hù)數(shù)據(jù)

SELECT * FROM user WHERE username = 'admin'

再根據(jù)查出來(lái)的user信息去對(duì)比密碼是否正確

這時(shí)你發(fā)現(xiàn)username字段是唯一的又經(jīng)常作為where條件所以可以給username字段建一個(gè)索引,于是就給username建了一個(gè)普通的B+Tree索引。

這時(shí)候就出問(wèn)題的,因?yàn)镸ySQL的InnoDB使用聚簇索引,具體的數(shù)據(jù)只和主鍵索引放在一起,其他的索引只存儲(chǔ)了數(shù)據(jù)的地址(主鍵id)。

比如上面的例子中,我根據(jù)username索引找到的只是一個(gè)username為admin這條數(shù)據(jù)的id而不是這條數(shù)據(jù)信息,所以要找到整條數(shù)據(jù)信息要根據(jù)得到的id再去找。

看完上面的流程,你應(yīng)該已經(jīng)發(fā)現(xiàn)問(wèn)題了,我要通過(guò)username找到id,再根據(jù)id找整條數(shù)據(jù),這里有兩個(gè)查找過(guò)程,這是影響效率的。就像上面的兩個(gè)查找過(guò)程就是回表了。

四、解決辦法

使用覆蓋索引可以解決上面所說(shuō)的回表的問(wèn)題。
還是拿上面上面登錄的例子來(lái)說(shuō),其實(shí)登錄只需要判斷用戶(hù)名和密碼,如果user表中有其他用戶(hù)信息也是不需要的那我們能不能只查詢(xún)一次就找到這個(gè)用戶(hù)名對(duì)應(yīng)的密碼呢。

這個(gè)是可以的,上面所說(shuō)的分兩步查找,第一步根據(jù)username查找是肯定不能少的,那我們只要把password和索引username放到一起就可以了。我們可以建立一個(gè)(username、password)的組合索引,這里username一定要放在前面,然后我們把sql語(yǔ)句改一下

SELECT username, password FROM user WHERE username = 'admin'

SELECT password FROM user WHERE username = 'admin'

這樣建立組合索引后根據(jù)username查找password,只要一步查找就可以查找到,因?yàn)閜assword已經(jīng)是username索引的一部分了,直接可以查出來(lái),不再需要通過(guò)id找對(duì)應(yīng)的整條數(shù)據(jù)。覆蓋索引就是覆蓋了多個(gè)列(字段)的索引。

五、更多如下圖:

(1)先通過(guò)普通索引定位到主鍵值id=5;
(2)在通過(guò)聚集索引定位到行記錄;

這就是所謂的回表查詢(xún),先定位主鍵值,再定位行記錄,它的性能較掃一遍索引樹(shù)更低。

六、總結(jié)

使用聚集索引(主鍵或第一個(gè)唯一索引)就不會(huì)回表,普通索引就會(huì)回表。

到此這篇關(guān)于一文弄懂什么是MySQL的回表的文章就介紹到這了,更多相關(guān)MySQL 回表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql8.0如何修改root密碼

    mysql8.0如何修改root密碼

    這篇文章主要介紹了mysql8.0修改root密碼的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • mysql split函數(shù)用逗號(hào)分隔的實(shí)現(xiàn)

    mysql split函數(shù)用逗號(hào)分隔的實(shí)現(xiàn)

    這篇文章主要介紹了mysql split函數(shù)用逗號(hào)分隔的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解mysql 獲取某個(gè)時(shí)間段每一天、每一個(gè)小時(shí)的統(tǒng)計(jì)數(shù)據(jù)

    詳解mysql 獲取某個(gè)時(shí)間段每一天、每一個(gè)小時(shí)的統(tǒng)計(jì)數(shù)據(jù)

    這篇文章主要介紹了mysql 獲取某個(gè)時(shí)間段每一天、每一個(gè)小時(shí)的統(tǒng)計(jì)數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • mysql 5.7.9 免安裝版配置方法圖文教程

    mysql 5.7.9 免安裝版配置方法圖文教程

    這篇文章主要為大家分享了mysql 5.7.9 免安裝版配置方法圖文教程,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 在MySQL中使用子查詢(xún)和標(biāo)量子查詢(xún)的基本操作教程

    在MySQL中使用子查詢(xún)和標(biāo)量子查詢(xún)的基本操作教程

    這篇文章主要介紹了在MySQL中使用子查詢(xún)和標(biāo)量子查詢(xún)的基本操作教程,子查詢(xún)的使用時(shí)MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-12-12
  • MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯(cuò)誤的解決辦法

    MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has

    這篇文章主要給大家介紹了MySQL安裝出現(xiàn)The?configuration?for?MySQL?Server?8.0.28?has?failed.?You?can...錯(cuò)誤的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 在SpringBoot中實(shí)現(xiàn)WebSocket會(huì)話(huà)管理的方案

    在SpringBoot中實(shí)現(xiàn)WebSocket會(huì)話(huà)管理的方案

    在構(gòu)建實(shí)時(shí)通信應(yīng)用時(shí),WebSocket 無(wú)疑是一個(gè)強(qiáng)大的工具,SpringBoot提供了對(duì)WebSocket的支持,本文旨在探討如何在 Spring Boot 應(yīng)用中實(shí)現(xiàn) WebSocket 會(huì)話(huà)管理,我們將通過(guò)一個(gè)模擬的場(chǎng)景一步步展開(kāi)討論,需要的朋友可以參考下
    2023-11-11
  • MySQL分區(qū)表語(yǔ)法解讀

    MySQL分區(qū)表語(yǔ)法解讀

    MySQL分區(qū)表主要用于提高查詢(xún)效率,通過(guò)將數(shù)據(jù)分割成更小的部分進(jìn)行管理,文章詳細(xì)介紹了如何創(chuàng)建、查詢(xún)、修改和存儲(chǔ)分區(qū)表,包括創(chuàng)建復(fù)合主鍵、按年份和月份分區(qū)、刪除分區(qū)、查詢(xún)分區(qū)數(shù)據(jù)以及利用存儲(chǔ)過(guò)程批量轉(zhuǎn)換非分區(qū)表為分區(qū)表等方法
    2025-02-02
  • MySQL中的BETWEEN...AND的使用情況

    MySQL中的BETWEEN...AND的使用情況

    這篇文章主要介紹了MySQL中的BETWEEN...AND的使用情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論