最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL聚簇索引、非聚簇索引、覆蓋索引詳解

 更新時(shí)間:2024年12月25日 09:27:25   作者:高錳酸鉀_  
這篇文章詳細(xì)介紹了聚簇索引、非聚簇索引和覆蓋索引的概念,并通過圖示和實(shí)例說明了索引查找的過程和回表查詢的概念,同時(shí),文章也提到了覆蓋索引的優(yōu)點(diǎn)和弊端,并給出了適用場(chǎng)景

聚簇索引、非聚簇索引、覆蓋索引

本篇將帶你搞懂什么是聚簇索引、非聚簇索引、覆蓋索引,并且通過畫圖的方式了解索引查找的過程,明白什么是回表查詢

索引(Index)是數(shù)據(jù)庫(kù)中一種用于快速查找和訪問表中數(shù)據(jù)的結(jié)構(gòu),它類似于書的目錄,通過索引可以快速定位到目標(biāo)數(shù)據(jù),而無(wú)需遍歷整個(gè)表,索引的存在可以顯著提高查詢速度,尤其是在處理大量數(shù)據(jù)時(shí)

MySQL中默認(rèn)使用索引的數(shù)據(jù)結(jié)構(gòu)是B+樹,詳細(xì)可以參考:MySQL索引為什么是B+數(shù)

那什么又是聚簇索引、非聚簇索引、覆蓋索引?

聚簇索引

聚簇索引也叫聚集索引,是一種將數(shù)據(jù)行的物理存儲(chǔ)順序與索引的邏輯順序相同的索引,換句話說,數(shù)據(jù)是直接存儲(chǔ)在索引的葉子節(jié)點(diǎn)中,通過主鍵查找到某一行數(shù)據(jù),這一行數(shù)據(jù)的全部?jī)?nèi)容都存放在這個(gè)葉子節(jié)點(diǎn)中,聚簇索引必須有,而且只能有一個(gè)。

以下面這個(gè)表為例:

idnameusernameage
1001張三zhangsan20
1002李四lisi18
1003王九wangjiu35
1004趙六zhaoliu22
1005王八wangba17
1006李白libai40
1007杜甫dufu33

以主鍵id來為其生成一個(gè)簡(jiǎn)單的B+樹索引為:

這個(gè)利用主鍵字段來生成的索引就是一個(gè)聚簇索引,當(dāng)我們通過id查找某一個(gè)用戶時(shí),通過查找算法,找到了他所在的葉子節(jié)點(diǎn),那么在這個(gè)葉子節(jié)點(diǎn)中,就存放了該用戶的整行數(shù)據(jù),包括姓名、賬號(hào)、年齡:

如果定義了主鍵,MySQL會(huì)自動(dòng)將主鍵列作為聚簇索引;如果沒有主鍵,MySQL會(huì)選擇一個(gè)唯一非空索引;如果沒有唯一索引,MySQL會(huì)生成一個(gè)隱藏的rowid作為主鍵來生成聚簇索引

非聚簇索引

相比于聚簇索引,非聚簇索引也叫二級(jí)索引,它的葉子節(jié)點(diǎn)存儲(chǔ)的是索引列的值以及指向?qū)嶋H數(shù)據(jù)行的指針(或主鍵值),而不是完整的數(shù)據(jù)行,也就是說,非聚簇索引的葉子節(jié)點(diǎn)中,存放的不再是整行數(shù)據(jù),而是該行數(shù)據(jù)的主鍵

當(dāng)我們?yōu)樯媳斫⑺饕龝r(shí),使用的不是id,而是username

默認(rèn)會(huì)使用字母順序來進(jìn)行排序,但是其葉子節(jié)點(diǎn)中存儲(chǔ)的不再是整行數(shù)據(jù),而是該行數(shù)據(jù)的索引值

回表查詢

回表查詢是數(shù)據(jù)庫(kù)查詢中的一個(gè)術(shù)語(yǔ),指的是在使用非聚簇索引(或普通索引)時(shí),數(shù)據(jù)庫(kù)查詢引擎需要通過索引查找到對(duì)應(yīng)的行號(hào)(或主鍵值),然后再回到表中查找完整的行數(shù)據(jù)的過程

以上表為例,我們想要查詢usernamezhaoliu的用戶全部信息:

select * from user where username = 'zhaoliu'

1.此時(shí)回先到username的非聚簇索引中去查找

通過username的比對(duì)查找,找到了zhaoliu所在的葉子節(jié)點(diǎn),但是葉子節(jié)點(diǎn)中并沒有我們需要的全部用戶信息,只有該用戶的主鍵值id

2.這時(shí)就會(huì)拿著id去聚簇索引中比對(duì)查找

找到該用戶的葉子節(jié)點(diǎn),再把葉子節(jié)點(diǎn)中的整行數(shù)據(jù)返回

回表查詢?cè)黾恿?I/O 操作,尤其是表數(shù)據(jù)量大時(shí)會(huì)顯著降低性能,所以我們?cè)谠O(shè)計(jì)索引時(shí),盡量要避免出現(xiàn)回表查詢

當(dāng)查詢的字段較少且頻率較高時(shí),建議使用覆蓋索引優(yōu)化查詢

覆蓋索引

覆蓋索引(Covering Index) 是一種索引優(yōu)化技術(shù),指的是查詢所需的所有字段都可以直接從索引中獲取,無(wú)需再回表查詢。這種方式可以顯著提高查詢性能,因?yàn)楸苊饬嘶乇聿僮?/p>

也就是說,當(dāng)我們建立索引時(shí),不再使用單一字段來建立索引,而是包含多個(gè)字段,這樣在利用索引進(jìn)行查詢信息時(shí),葉子節(jié)點(diǎn)中可以包含全部的所需數(shù)據(jù),不必再到其他索引中查詢,因此可以避免回表查詢

比如之前以username建立的索引,如果我們不查詢用戶的全部數(shù)據(jù),而是只需要返回usernameid

select id,name from user where name = 'zhangsan'

username建立的索引中已經(jīng)包含了想要的全部數(shù)據(jù):usernameid,因此不需要再去查詢其他的索引,這就是覆蓋索引

在建立索引時(shí),可以設(shè)置多字段建立索引:

CREATE INDEX idx_name_age ON users(name, age)

這樣索引的葉子節(jié)點(diǎn)中就存放了更多的數(shù)據(jù)

當(dāng)我們查詢所需要的信息nameage時(shí),索引 idx_name_age 包含 nameage,因此查詢所需的字段完全覆蓋,無(wú)需回表

SELECT name, age FROM users WHERE name = 'John'

但是覆蓋索引也有一些弊端:

  • 1.增加存儲(chǔ)開銷
  • 索引存儲(chǔ)需要額外空間,字段越多,索引越大。
  • 2.寫性能受影響
  • 插入、更新、刪除操作需要同時(shí)更新覆蓋索引,導(dǎo)致寫入開銷增加。
  • 3.適用場(chǎng)景有限
  • 覆蓋索引適用于查詢固定字段的場(chǎng)景,但無(wú)法應(yīng)對(duì)動(dòng)態(tài)字段需求。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 簡(jiǎn)單的MySQL備份與還原方法分享

    簡(jiǎn)單的MySQL備份與還原方法分享

    這篇文章主要介紹了簡(jiǎn)單的MySQL備份與還原方法,文中Linux與Windows的兩種情況都有介紹,需要的朋友可以參考下
    2015-08-08
  • 如何用word vb宏來生成sql

    如何用word vb宏來生成sql

    本篇文章是對(duì)利用word vb宏來生成sql的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • DBA應(yīng)該知道的一些關(guān)于SQL Server跟蹤標(biāo)記的使用

    DBA應(yīng)該知道的一些關(guān)于SQL Server跟蹤標(biāo)記的使用

    本篇文章小編為大家介紹,DBA應(yīng)該知道的一些關(guān)于SQL Server跟蹤標(biāo)記的使用。需要的朋友參考下
    2013-04-04
  • 利用Sqoop實(shí)現(xiàn)MySQL數(shù)據(jù)導(dǎo)入Hive的全流程

    利用Sqoop實(shí)現(xiàn)MySQL數(shù)據(jù)導(dǎo)入Hive的全流程

    在大數(shù)據(jù)領(lǐng)域中,MySQL 和 Hive 是兩種常見的存儲(chǔ)工具,MySQL 適合事務(wù)處理,而 Hive 則是用于離線數(shù)據(jù)分析的利器,本文將全面講解如何使用 Sqoop 將 MySQL 數(shù)據(jù)導(dǎo)入 Hive 的完整流程,包括環(huán)境配置、具體操作步驟以及最佳實(shí)踐和常見問題解決方案,需要的朋友可以參考下
    2024-12-12
  • MySQL中修改lower_case_table_names方式

    MySQL中修改lower_case_table_names方式

    這篇文章主要介紹了MySQL中修改lower_case_table_names方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Mysql 5.7.18 利用MySQL proxies_priv實(shí)現(xiàn)類似用戶組管理

    Mysql 5.7.18 利用MySQL proxies_priv實(shí)現(xiàn)類似用戶組管理

    這篇文章主要為大家詳細(xì)介紹了Mysql 5.7.18利用MySQL proxies_priv實(shí)現(xiàn)類似用戶組管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • linux Xtrabackup安裝及使用方法

    linux Xtrabackup安裝及使用方法

    Xtrabackup是一個(gè)對(duì)InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),是商業(yè)備份工具InnoDB Hotbackup的一個(gè)很好的替代品
    2013-04-04
  • Mysql的復(fù)合索引如何生效

    Mysql的復(fù)合索引如何生效

    本文主要介紹了Mysql的復(fù)合索引如何生效,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • MYSQL刪除表中的指定ID數(shù)據(jù)

    MYSQL刪除表中的指定ID數(shù)據(jù)

    有些時(shí)候我們需要?jiǎng)h除表中指定ID數(shù)據(jù),主要是接下模糊刪除,需要的朋友可以參考下
    2013-01-01
  • sql ROW_NUMBER()與OVER()方法案例詳解

    sql ROW_NUMBER()與OVER()方法案例詳解

    這篇文章主要介紹了sql ROW_NUMBER()與OVER()方法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

上林县| 巴彦淖尔市| 三门峡市| 四子王旗| 蒙阴县| 和静县| 迁安市| 汪清县| 杭锦旗| 砚山县| 原阳县| 灌云县| 板桥市| 石林| 虹口区| 南昌市| 裕民县| 汕头市| 石家庄市| 常州市| 宜君县| 麻栗坡县| 宜春市| 措勤县| 泗阳县| 钟祥市| 马公市| 广灵县| 鹤山市| 尖扎县| 安庆市| 龙州县| 建水县| 墨江| 交口县| 古田县| 修武县| 封开县| 邵阳市| 蒲江县| 河源市|