聚集索引與非聚集索引

一、什么是聚集索引(Clustered Index)

聚集索引是一種 數(shù)據(jù)存儲(chǔ)方式,它將 索引和數(shù)據(jù)放在同一個(gè) B+ 樹結(jié)構(gòu)中

  • 一個(gè)表最多只能有一個(gè)聚集索引。
  • 聚集索引的葉子節(jié)點(diǎn)就是數(shù)據(jù)行本身。
  • 表的數(shù)據(jù)是按照聚集索引的順序進(jìn)行物理存儲(chǔ)的。

二、什么是非聚集索引(Secondary Index / Non-Clustered Index)

非聚集索引是指 索引結(jié)構(gòu)與數(shù)據(jù)分離,索引的葉子節(jié)點(diǎn)存儲(chǔ)的是指向真實(shí)數(shù)據(jù)的“指針”或“主鍵值”。

  • 一個(gè)表可以有多個(gè)非聚集索引。
  • 查詢非聚集索引字段時(shí),需要通過主鍵回表查詢實(shí)際數(shù)據(jù)(稱為“回表”)。

三、對(duì)比總結(jié)

特性 聚集索引 非聚集索引
結(jié)構(gòu) 索引和數(shù)據(jù)在同一棵 B+ 樹中 索引與數(shù)據(jù)分離,葉子節(jié)點(diǎn)存儲(chǔ)主鍵值
數(shù)據(jù)訪問 直接從索引中獲取數(shù)據(jù),無需回表 需要根據(jù)主鍵回表獲取數(shù)據(jù)
數(shù)量限制 每個(gè)表只能有一個(gè) 一個(gè)表可以有多個(gè)
適用場(chǎng)景 范圍查詢、高頻排序、高頻主鍵查詢 精確查詢、非主鍵字段索引查詢

InnoDB 與 MyISAM 索引類型對(duì)比

引擎 聚集索引 非聚集索引
InnoDB 默認(rèn)使用聚集索引(主鍵) 支持非聚集索引
MyISAM 不支持聚集索引 所有索引都是非聚集索引

InnoDB 特點(diǎn)

  • 使用主鍵作為聚集索引(沒有主鍵則選擇第一個(gè)唯一非空索引,否則隱式生成 rowid)。
  • 二級(jí)索引的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵值(回表查詢依賴聚集索引)。
  • 事務(wù)支持強(qiáng),支持行級(jí)鎖。

MyISAM 特點(diǎn)

  • 所有索引的葉子節(jié)點(diǎn)都指向數(shù)據(jù)文件的物理地址。
  • 不支持聚集索引,也不支持事務(wù)和行級(jí)鎖。

面試總結(jié)

在面試中可以這樣說:

在 InnoDB 中,主鍵是聚集索引,數(shù)據(jù)存儲(chǔ)在聚集索引的葉子節(jié)點(diǎn)中;而二級(jí)索引是非聚集索引,存儲(chǔ)的是主鍵值,所以查詢非主鍵字段時(shí)需要“回表”。而 MyISAM 不支持聚集索引,所有索引都是非聚集索引,葉子節(jié)點(diǎn)直接存儲(chǔ)數(shù)據(jù)地址。InnoDB 適合高并發(fā)事務(wù)場(chǎng)景,MyISAM 更適合讀多寫少的查詢場(chǎng)景。

聯(lián)合索引(組合索引)與最左前綴原則

一、聯(lián)合索引(組合索引)

聯(lián)合索引是指對(duì)多個(gè)字段建立的一個(gè)索引,本質(zhì)是一個(gè)多列的 B+ 樹索引。例如:

CREATE INDEX idx_name_age ON user(name, age);

二、最左前綴原則(Leftmost Prefix Rule)

最左前綴原則指:在使用聯(lián)合索引時(shí),查詢條件必須包含聯(lián)合索引中最左邊的一列或連續(xù)前綴列,索引才會(huì)生效。

例如,有一個(gè)聯(lián)合索引:

CREATE INDEX idx_a_b_c ON table(a, b, c);

下列查詢中,索引的使用情況如下:

  • WHERE a = 1
    ? 命中索引,符合最左前綴。

  • WHERE a = 1 AND b = 2
    ? 命中索引,連續(xù)使用了前綴列。

  • WHERE a = 1 AND c = 3
    ? 僅 a 使用索引,c 無法利用索引。

  • WHERE b = 2
    ? 不命中索引,跳過了最左列 a。

  • WHERE a > 10 AND b = 3
    ? a 為范圍查詢,b 無法再使用索引。


總結(jié)

聯(lián)合索引按順序建立,查詢時(shí)必須遵循“最左前綴”原則。
只有從最左邊開始連續(xù)使用字段,索引才能被正確利用。

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

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

  • 一.索引簡(jiǎn)介 眾所周知,索引是關(guān)系型數(shù)據(jù)庫(kù)中給數(shù)據(jù)庫(kù)表中一列或多列的值排序后的存儲(chǔ)結(jié)構(gòu),SQL的主流索引結(jié)構(gòu)有B+...
    貳爺閱讀 326評(píng)論 0 4
  • Mysql中常用的兩個(gè)存儲(chǔ)引擎innodb和mysiam的索引是不同的。 聚集索引就是以主鍵創(chuàng)建的索引 非聚集索引...
    camellias__閱讀 502評(píng)論 0 0
  • 1.聚集索引 聚集(clustered)索引,也叫聚簇索引。 定義:數(shù)據(jù)行的物理順序與列值(一般是主鍵的那一列)的...
    程序員kk閱讀 1,295評(píng)論 1 0
  • 聚集索引與非聚集索引 數(shù)據(jù)庫(kù)索引在物理存儲(chǔ)層面可以分為兩類:聚集索引、非聚集索引。 1. 聚集索引(聚簇索引) 1...
    dragonMen閱讀 562評(píng)論 0 0
  • 一.索引簡(jiǎn)介 眾所周知,索引是關(guān)系型數(shù)據(jù)庫(kù)中給數(shù)據(jù)庫(kù)表中一列或多列的值排序后的存儲(chǔ)結(jié)構(gòu),SQL的主流索引結(jié)構(gòu)有B+...
    Binary_r閱讀 1,275評(píng)論 0 0

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