亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL的InnoDB引擎中聚簇索引和非聚簇索引詳解

 更新時(shí)間:2025年08月18日 10:59:27   作者:dj_master  
InnoDB中聚簇索引存儲(chǔ)完整數(shù)據(jù)行,非聚簇索引存儲(chǔ)索引鍵+主鍵值,聚簇索引直接查詢數(shù)據(jù),非聚簇需回表,主鍵建議用自增ID減少頁分裂,二級(jí)索引可優(yōu)化覆蓋索引提升效率

在 MySQL 的 InnoDB 引擎中,聚簇索引(Clustered Index)和非聚簇索引(Non - Clustered Index,也叫二級(jí)索引、輔助索引 )是索引體系的核心,二者在存儲(chǔ)結(jié)構(gòu)、查詢邏輯、適用場景等方面差異顯著,以下從底層原理到實(shí)際影響詳細(xì)拆解:

一、核心定義與存儲(chǔ)結(jié)構(gòu)差異

1. 聚簇索引(Clustered Index)

定義

  • InnoDB 中,聚簇索引的葉子節(jié)點(diǎn)直接存儲(chǔ)完整的數(shù)據(jù)行(即表記錄的物理存儲(chǔ)與索引結(jié)構(gòu)融合 )。

存儲(chǔ)結(jié)構(gòu)

  • 葉子節(jié)點(diǎn)包含主鍵值 + 所有字段數(shù)據(jù)(如 id + name + age + … )。
  • 非葉子節(jié)點(diǎn)存主鍵值和子節(jié)點(diǎn)指針,用于快速定位葉子節(jié)點(diǎn)。
  • 一張表只能有一個(gè)聚簇索引(默認(rèn)是主鍵索引;若表無主鍵,選唯一非空索引;若都沒有,InnoDB 會(huì)隱式創(chuàng)建一個(gè) 6 字節(jié)的 row_id 作為聚簇索引 )。

2. 非聚簇索引(二級(jí)索引、輔助索引 )

定義

  • 非聚簇索引的葉子節(jié)點(diǎn)存儲(chǔ)“索引鍵值 + 主鍵值”,不存完整數(shù)據(jù)行,需通過主鍵回表查詢完整數(shù)據(jù)。

存儲(chǔ)結(jié)構(gòu)

  • 葉子節(jié)點(diǎn)包含索引鍵值(如 name ) + 主鍵值(如 id。
  • 非葉子節(jié)點(diǎn)存索引鍵值和子節(jié)點(diǎn)指針,用于定位葉子節(jié)點(diǎn)。
  • 一張表可以有多個(gè)非聚簇索引(如對(duì) nameage 分別建索引 )。

二、查詢流程差異(以查詢SELECT * FROM user WHERE name = 'Alice'為例 )

假設(shè)表 user 結(jié)構(gòu):id(主鍵,聚簇索引 )、name(二級(jí)索引 )、age 等字段。

1. 聚簇索引查詢流程

若查詢條件是 WHERE id = 1(主鍵,走聚簇索引 ):

  1. 從聚簇索引的根節(jié)點(diǎn)開始,通過二分查找定位到 id = 1 的葉子節(jié)點(diǎn)。
  2. 葉子節(jié)點(diǎn)直接存完整數(shù)據(jù)行(id=1 + name=Alice + age=20 + … ),直接返回結(jié)果,無需額外操作。

2. 非聚簇索引查詢流程(需回表 )

若查詢條件是 WHERE name = 'Alice'name 是二級(jí)索引 ):

  1. name 二級(jí)索引的根節(jié)點(diǎn)開始,二分查找定位到 name = 'Alice' 的葉子節(jié)點(diǎn)。
  2. 葉子節(jié)點(diǎn)拿到對(duì)應(yīng)的主鍵值(如 id = 1 )。
  3. 回表:用主鍵值 id = 1 到聚簇索引中查找,定位到聚簇索引的葉子節(jié)點(diǎn),獲取完整數(shù)據(jù)行(id=1 + name=Alice + age=20 + … )。
  4. 返回完整數(shù)據(jù)行給 Server 層。

三、關(guān)鍵區(qū)別總結(jié)(表格對(duì)比)

對(duì)比維度聚簇索引非聚簇索引
存儲(chǔ)內(nèi)容葉子節(jié)點(diǎn)存完整數(shù)據(jù)行(主鍵 + 所有字段)葉子節(jié)點(diǎn)存索引鍵值 + 主鍵值
數(shù)量限制一張表僅 1 個(gè)(主鍵/隱式 row_id )一張表可多個(gè)(按需創(chuàng)建二級(jí)索引)
查詢是否回表直接返回?cái)?shù)據(jù),無需回表需用主鍵回查聚簇索引,必然回表(除非覆蓋索引 )
索引與數(shù)據(jù)的關(guān)系索引結(jié)構(gòu)與數(shù)據(jù)物理存儲(chǔ)完全融合索引結(jié)構(gòu)與數(shù)據(jù)物理存儲(chǔ)分離,需關(guān)聯(lián)主鍵
插入/更新影響數(shù)據(jù)插入需調(diào)整聚簇索引結(jié)構(gòu),可能引發(fā)頁分裂插入/更新僅調(diào)整二級(jí)索引,影響相對(duì)小
查詢性能主鍵查詢極快,但二級(jí)索引查詢需回表二級(jí)索引查詢需額外回表,性能略低(覆蓋索引除外 )

四、實(shí)際影響與設(shè)計(jì)建議

1. 對(duì)查詢性能的影響

  • 聚簇索引優(yōu)勢(shì):主鍵查詢(如 WHERE id = ? )直接命中數(shù)據(jù),無需回表,效率極高。
  • 非聚簇索引劣勢(shì):二級(jí)索引查詢需回表,多一次 IO(若緩沖池未緩存聚簇索引頁 ),性能比聚簇索引查詢低。但可通過覆蓋索引優(yōu)化(若查詢字段都在二級(jí)索引中,無需回表 )。

2. 對(duì)數(shù)據(jù)插入的影響

  • 聚簇索引頁分裂:若主鍵是無序的(如 UUID ),插入時(shí)可能頻繁導(dǎo)致頁分裂(數(shù)據(jù)頁已滿,需分裂成兩個(gè)頁 ),增加 IO 開銷。
  • 非聚簇索引更靈活:二級(jí)索引插入僅調(diào)整自身結(jié)構(gòu),對(duì)數(shù)據(jù)物理存儲(chǔ)(聚簇索引 )無影響,適合頻繁更新的字段。

3. 設(shè)計(jì)建議

主鍵選擇

  • 優(yōu)先用自增主鍵(如 BIGINT AUTO_INCREMENT ),減少聚簇索引插入時(shí)的頁分裂,提升寫入性能。

二級(jí)索引設(shè)計(jì)

  • 避免冗余索引(如對(duì) namename, age 同時(shí)建索引 ),增加維護(hù)成本。
  • 利用覆蓋索引(如查詢 nameage ,建 (name, age) 聯(lián)合索引 ),減少回表。
  • 對(duì)高頻查詢的非主鍵字段,合理建二級(jí)索引,平衡查詢與寫入性能。

五、總結(jié):聚簇與非聚簇的本質(zhì)

聚簇索引是 “索引即數(shù)據(jù),數(shù)據(jù)即索引” 的深度融合,最大化主鍵查詢效率,但插入需謹(jǐn)慎;非聚簇索引是 “索引指向數(shù)據(jù)” 的分離結(jié)構(gòu),支持靈活查詢,但依賴回表(或覆蓋索引 )優(yōu)化性能。

InnoDB 中,二者協(xié)同構(gòu)成索引體系,理解差異是設(shè)計(jì)高性能表結(jié)構(gòu)的基礎(chǔ)。

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

相關(guān)文章

  • Mysql的row_number函數(shù)使用介紹

    Mysql的row_number函數(shù)使用介紹

    這篇文章主要為大家介紹了Mysql的row_number函數(shù)使用原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • MySQL三大日志(binlog、redo?log和undo?log)圖文詳解

    MySQL三大日志(binlog、redo?log和undo?log)圖文詳解

    日志是MySQL數(shù)據(jù)庫的重要組成部分,記錄著數(shù)據(jù)庫運(yùn)行期間各種狀態(tài)信息,下面這篇文章主要給大家介紹了關(guān)于MySQL三大日志(binlog、redo?log和undo?log)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 詳解如何用SQL取出字段內(nèi)是json的數(shù)據(jù)

    詳解如何用SQL取出字段內(nèi)是json的數(shù)據(jù)

    數(shù)據(jù)庫中會(huì)遇到字段里面存的JSON結(jié)果的數(shù)據(jù),那么如果我們想直接取到JSON里的值該怎么辦呢?其實(shí)SQL自帶的函數(shù)就可解決本文就詳細(xì)的給大家介紹了如何用SQL取出字段內(nèi)是json的數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • 使用MySQL實(shí)現(xiàn)一個(gè)分布式鎖

    使用MySQL實(shí)現(xiàn)一個(gè)分布式鎖

    在分布式系統(tǒng)中,分布鎖是一個(gè)最基礎(chǔ)的工具類。這篇文章主要介紹了用MySQL實(shí)現(xiàn)一個(gè)分布式鎖,本文通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • MySQL8.0創(chuàng)建用戶和權(quán)限控制示例詳解

    MySQL8.0創(chuàng)建用戶和權(quán)限控制示例詳解

    這篇文章主要為大家介紹了MySQL8.0創(chuàng)建用戶和權(quán)限控制實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • MySQL中TEXT類型存儲(chǔ)極限與實(shí)踐案例

    MySQL中TEXT類型存儲(chǔ)極限與實(shí)踐案例

    本文解析MySQL TEXT類型存儲(chǔ)極限及工程實(shí)踐,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-10-10
  • MySQL獲取binlog的開始時(shí)間和結(jié)束時(shí)間(最新方法)

    MySQL獲取binlog的開始時(shí)間和結(jié)束時(shí)間(最新方法)

    這篇文章主要介紹了MySQL如何獲取binlog的開始時(shí)間和結(jié)束時(shí)間,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Windows系統(tǒng)下MySQL8.0.21安裝教程(圖文詳解)

    Windows系統(tǒng)下MySQL8.0.21安裝教程(圖文詳解)

    這篇文章主要介紹了Windows系統(tǒng)下MySQL8.0.21安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • mysql誤刪root用戶或者忘記root密碼解決方法

    mysql誤刪root用戶或者忘記root密碼解決方法

    mysql誤刪root用戶或者忘記root密碼解決方法,需要的朋友可以參考下。
    2011-05-05
  • MySQL數(shù)據(jù)備份方法的選擇與思考

    MySQL數(shù)據(jù)備份方法的選擇與思考

    這篇文章主要介紹了MySQL數(shù)據(jù)備份方法該如何選擇,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-03-03

最新評(píng)論