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

Mysql數(shù)據(jù)庫聚簇索引與非聚簇索引舉例詳解

 更新時間:2025年11月12日 11:47:00   作者:城管不管  
在MySQL中聚簇索引和非聚簇索引是兩種常見的索引結(jié)構(gòu),它們的主要區(qū)別在于數(shù)據(jù)的存儲方式和索引的組織方式,這篇文章主要介紹了Mysql數(shù)據(jù)庫聚簇索引與非聚簇索引的相關(guān)資料,需要的朋友可以參考下

前言

在 MySQL 中,索引是提升查詢性能的核心機制,而聚簇索引(Clustered Index)與非聚簇索引(Non-Clustered Index)是兩種底層存儲結(jié)構(gòu)截然不同的索引類型,它們直接影響數(shù)據(jù)的物理存儲方式和查詢效率。下面從定義、結(jié)構(gòu)、區(qū)別、適用場景等方面詳細解析。

一、核心概念與本質(zhì)區(qū)別

聚簇索引和非聚簇索引的本質(zhì)差異在于索引與數(shù)據(jù)的存儲關(guān)系

特性聚簇索引(Clustered Index)非聚簇索引(Non-Clustered Index)
存儲方式索引結(jié)構(gòu)與數(shù)據(jù)行物理存儲在一起,索引即數(shù)據(jù)索引結(jié)構(gòu)與數(shù)據(jù)行物理分離,索引僅存儲指向數(shù)據(jù)的指針
數(shù)據(jù)排序數(shù)據(jù)行按索引鍵的順序物理排序存儲數(shù)據(jù)行物理存儲順序與索引鍵無關(guān)
數(shù)量限制一個表只能有 1 個聚簇索引(InnoDB 引擎)一個表可以有多個非聚簇索引(數(shù)量受限于存儲引擎)
葉子節(jié)點內(nèi)容存儲完整的數(shù)據(jù)行(包含所有字段值)存儲索引鍵 + 聚簇索引鍵(通過聚簇索引查找完整數(shù)據(jù))
典型場景主鍵查詢、范圍查詢(依賴有序性)非主鍵字段的查詢(如用戶名、郵箱檢索)

二、聚簇索引(Clustered Index)

聚簇索引是數(shù)據(jù)行的物理存儲順序與索引鍵順序一致的索引,即索引的葉子節(jié)點直接存儲完整的數(shù)據(jù)行。InnoDB 引擎中,聚簇索引是默認且唯一的(一個表只能有一個)。

1. 實現(xiàn)原理(以 InnoDB 為例)

  • 默認規(guī)則:InnoDB 會自動將主鍵作為聚簇索引。若表沒有定義主鍵,InnoDB 會選擇第一個非空的唯一索引作為聚簇索引;若既無主鍵也無唯一索引,InnoDB 會隱式創(chuàng)建一個隱藏的自增列(row_id)作為聚簇索引。
  • B + 樹結(jié)構(gòu):聚簇索引以 B+ 樹形式組織,特點是:
    • 非葉子節(jié)點:存儲索引鍵(如主鍵值)和指向子節(jié)點的指針;
    • 葉子節(jié)點:按索引鍵順序排列,存儲完整的數(shù)據(jù)行(包含所有字段值),且葉子節(jié)點之間通過雙向鏈表連接,便于范圍查詢。

示意圖:假設有一張 user 表,主鍵為 id(聚簇索引),數(shù)據(jù)行按 id 順序物理存儲:

聚簇索引 B+樹
┌─────────────┐
│  非葉子節(jié)點  │  →  存儲 id 范圍(如 1-100、101-200 等)
└─────────────┘
       ↓
┌─────────────────────────────────┐
│          葉子節(jié)點               │
│  id=1, name="A", age=20, ...    │  →  完整數(shù)據(jù)行
│  id=2, name="B", age=25, ...    │  →  按 id 順序排列
│  id=3, name="C", age=30, ...    │
│  ...(葉子節(jié)點間通過鏈表連接)   │
└─────────────────────────────────┘

2. 核心優(yōu)勢

  • 主鍵查詢效率極高:通過聚簇索引查詢時,找到葉子節(jié)點即獲取完整數(shù)據(jù),無需二次查找。
  • 范圍查詢高效:由于數(shù)據(jù)按索引鍵順序存儲,范圍查詢(如 WHERE id BETWEEN 10 AND 20)可直接通過葉子節(jié)點的鏈表快速定位連續(xù)數(shù)據(jù)塊。
  • 減少磁盤 I/O:一次索引查找即可獲取完整數(shù)據(jù),避免非聚簇索引的 “回表” 操作(見下文)。

3. 潛在缺點

  • 插入順序影響性能:若主鍵不是自增的(如隨機字符串),插入新數(shù)據(jù)時可能需要移動已有數(shù)據(jù)以維持有序性,導致大量磁盤 I/O(類似數(shù)組插入中間位置)。因此,聚簇索引鍵推薦使用自增整數(shù)(如 AUTO_INCREMENT)。
  • 更新聚簇索引鍵代價高:更新主鍵值會導致數(shù)據(jù)行物理位置移動,可能觸發(fā)大量數(shù)據(jù)重排。
  • 二級索引依賴聚簇索引:非聚簇索引(二級索引)的葉子節(jié)點需存儲聚簇索引鍵,若聚簇索引鍵過長(如長字符串主鍵),會導致二級索引體積增大,降低查詢效率。

三、非聚簇索引(Non-Clustered Index)

非聚簇索引(也稱二級索引、輔助索引)是索引結(jié)構(gòu)與數(shù)據(jù)行物理存儲分離的索引,其葉子節(jié)點不存儲完整數(shù)據(jù),僅存儲索引鍵和對應的聚簇索引鍵(用于定位數(shù)據(jù)行)。

1. 實現(xiàn)原理(以 InnoDB 為例)

  • B + 樹結(jié)構(gòu):非聚簇索引同樣以 B+ 樹組織,但葉子節(jié)點內(nèi)容不同:
    • 非葉子節(jié)點:存儲索引鍵(如 name 字段值)和指向子節(jié)點的指針;
    • 葉子節(jié)點:存儲索引鍵 + 對應的聚簇索引鍵(如主鍵 id),而非完整數(shù)據(jù)行。
  • “回表” 操作:通過非聚簇索引查詢時,需先找到葉子節(jié)點中的聚簇索引鍵,再通過聚簇索引查找完整數(shù)據(jù)行,這個過程稱為 “回表”。

示意圖:在 user 表上創(chuàng)建 name 字段的非聚簇索引,查詢流程如下:

非聚簇索引(name)B+樹
┌─────────────┐
│  非葉子節(jié)點  │  →  存儲 name 排序范圍(如 "A"-"M"、"N"-"Z" 等)
└─────────────┘
       ↓
┌───────────────────────┐
│       葉子節(jié)點        │
│  name="A" → id=1      │  →  存儲索引鍵 + 聚簇索引鍵(id)
│  name="B" → id=2      │
│  name="C" → id=3      │
└───────────────────────┘
       ↓ (回表)
┌───────────────────────┐
│   聚簇索引(id)B+樹  │  →  通過 id=1 找到完整數(shù)據(jù)行
└───────────────────────┘

2. 核心優(yōu)勢

  • 不影響數(shù)據(jù)物理存儲:非聚簇索引的增刪改不會改變數(shù)據(jù)行的物理位置,僅需維護索引結(jié)構(gòu),適合頻繁更新的字段。
  • 支持多字段索引:一個表可創(chuàng)建多個非聚簇索引,滿足不同查詢場景(如按 name 查、按 age 查)。
  • 索引鍵可靈活選擇:無需像聚簇索引那樣依賴自增鍵,可根據(jù)查詢頻率選擇合適的字段(如高頻查詢的 email、phone 等)。

3. 潛在缺點

  • 查詢需 “回表”:非聚簇索引無法直接獲取完整數(shù)據(jù),需通過聚簇索引二次查找,增加磁盤 I/O(除非命中 “覆蓋索引”,見下文)。
  • 索引維護成本高:多個非聚簇索引會占用更多存儲空間,且增刪改操作時需同步更新所有相關(guān)索引,降低寫入性能。

四、關(guān)鍵概念:覆蓋索引(Covering Index)

覆蓋索引是一種特殊的非聚簇索引,可避免 “回表” 操作,其核心是索引包含查詢所需的所有字段,即葉子節(jié)點存儲的信息已滿足查詢需求,無需再訪問聚簇索引。

示例:若查詢 SELECT id, name FROM user WHERE name = "A",且 name 是非聚簇索引,則該索引的葉子節(jié)點已包含 name(索引鍵)和 id(聚簇索引鍵),無需回表,直接返回結(jié)果。

優(yōu)化建議

  • 為高頻查詢創(chuàng)建 “包含所需字段” 的聯(lián)合索引(如 (name, age) 索引可覆蓋 SELECT name, age ... 的查詢);
  • 避免 SELECT *(可能導致無法使用覆蓋索引,必須回表)。

五、聚簇索引 vs 非聚簇索引:查詢流程對比

假設表結(jié)構(gòu):user(id INT PRIMARY KEY, name VARCHAR(50), age INT)id 是聚簇索引,name 是非聚簇索引。

  • 通過聚簇索引查詢(如 WHERE id = 1)

    • 步驟 1:遍歷聚簇索引 B+ 樹,找到 id=1 的葉子節(jié)點;
    • 步驟 2:直接從葉子節(jié)點獲取完整數(shù)據(jù)行(id=1, name="A", age=20);
    • 特點:無需回表,1 次索引查找完成。
  • 通過非聚簇索引查詢(如 WHERE name = "A")

    • 步驟 1:遍歷 name 非聚簇索引 B+ 樹,找到 name="A" 對應的葉子節(jié)點,獲取聚簇索引鍵 id=1
    • 步驟 2:遍歷聚簇索引 B+ 樹,通過 id=1 找到完整數(shù)據(jù)行;
    • 特點:需 2 次索引查找(回表),效率低于聚簇索引查詢(除非覆蓋索引)。

六、適用場景與最佳實踐

  • 聚簇索引設計原則

    • 優(yōu)先用自增整數(shù)作為主鍵(聚簇索引鍵),避免隨機鍵導致的插入性能問題;
    • 主鍵字段應簡短(如 INT 而非 VARCHAR(255)),減少二級索引的存儲空間;
    • 適合高頻主鍵查詢范圍查詢(如分頁查詢 LIMIT ... OFFSET ...)。
  • 非聚簇索引設計原則

    • 高頻過濾字段(如 WHERE、JOIN、ORDER BY 涉及的字段)創(chuàng)建非聚簇索引;
    • 利用聯(lián)合索引(如 (a, b))覆蓋多字段查詢,避免回表;
    • 控制索引數(shù)量(建議單表不超過 5-6 個),避免寫入性能下降。
  • 典型錯誤案例

    • 將長字符串設為主鍵(聚簇索引),導致二級索引體積過大;
    • 對更新頻繁的字段創(chuàng)建過多非聚簇索引,導致寫入卡頓;
    • 忽略覆蓋索引,頻繁使用 SELECT * 導致大量回表操作。

七、與存儲引擎的關(guān)系

  • InnoDB:僅支持聚簇索引(主鍵為默認),所有非聚簇索引都依賴聚簇索引;
  • MyISAM:不支持聚簇索引,所有索引都是非聚簇索引(葉子節(jié)點存儲數(shù)據(jù)行的物理地址,而非主鍵);
  • Memory:內(nèi)存表,索引類似 MyISAM,無聚簇索引概念。

總結(jié)

  • 聚簇索引:索引即數(shù)據(jù),物理有序,主鍵查詢和范圍查詢高效,但依賴自增鍵且更新代價高;
  • 非聚簇索引:索引與數(shù)據(jù)分離,支持多索引,適合高頻非主鍵查詢,但需回表(覆蓋索引除外);
  • 核心設計思路:用自增主鍵作為聚簇索引,為高頻查詢字段創(chuàng)建合理的非聚簇索引,并利用覆蓋索引減少回表。

理解兩者的差異,是優(yōu)化 MySQL 查詢性能的基礎,需結(jié)合業(yè)務查詢模式選擇合適的索引策略。

到此這篇關(guān)于Mysql數(shù)據(jù)庫聚簇索引與非聚簇索引的文章就介紹到這了,更多相關(guān)Mysql聚簇索引與非聚簇索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL定時器EVENT學習筆記

    MySQL定時器EVENT學習筆記

    本文為大家介紹下MySQL定時器EVENT,要使定時起作用 MySQL的常量GLOBAL event_scheduler必須為on或者是1,感興趣的朋友可以了解下
    2013-11-11
  • dos或wamp下修改mysql密碼的具體方法

    dos或wamp下修改mysql密碼的具體方法

    這篇文章主要介紹了dos或wamp下修改mysql密碼的具體方法,有需要的朋友可以參考一下
    2013-12-12
  • MySQL判斷時間段是否重合的兩種方法

    MySQL判斷時間段是否重合的兩種方法

    這篇文章介紹了MySQL判斷時間段是否重合的兩種方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • MySql like模糊查詢通配符使用詳細介紹

    MySql like模糊查詢通配符使用詳細介紹

    MySQL提供標準的SQL模式匹配,以及一種基于象Unix實用程序如vi、grep和sed的擴展正則表達式模式匹配的格式
    2013-10-10
  • MySQL的DELETE(刪除數(shù)據(jù))用法解讀

    MySQL的DELETE(刪除數(shù)據(jù))用法解讀

    本文將詳細介紹DELETE語句的基本語法、高級用法、性能優(yōu)化策略以及注意事項,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié)

    MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié)

    這篇文章主要介紹了MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • mysql免安裝版的實際配置方法

    mysql免安裝版的實際配置方法

    本文主要向大家講述的是MySQL 免安裝版的實際配置方法,以及對其的相關(guān)的下載網(wǎng)址也有詳細介紹,望你會有所收獲。
    2010-08-08
  • mysql 5.7.27 安裝配置方法圖文教程

    mysql 5.7.27 安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.27 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • MySQL主從同步必然有延遲如何解決

    MySQL主從同步必然有延遲如何解決

    MySQL主從同步延遲的解決方案包括優(yōu)化硬件和網(wǎng)絡、MySQL配置、數(shù)據(jù)庫結(jié)構(gòu)和查詢、監(jiān)控和告警、架構(gòu)優(yōu)化、業(yè)務層面解決,選擇合適的解決方案需要綜合考慮延遲容忍度、數(shù)據(jù)一致性要求、系統(tǒng)復雜性和成本
    2025-03-03
  • MYSQL 完全備份、主從復制、級聯(lián)復制、半同步小結(jié)

    MYSQL 完全備份、主從復制、級聯(lián)復制、半同步小結(jié)

    這篇文章主要介紹了MYSQL 完全備份、主從復制、級聯(lián)復制、半同步小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論

常熟市| 会同县| 吉木萨尔县| 奈曼旗| 来安县| 夏津县| 望谟县| 尼木县| 九龙坡区| 商洛市| 德格县| 昭平县| 监利县| 个旧市| 江油市| 霍山县| 科技| 化德县| 毕节市| 上杭县| 阿克陶县| 论坛| 江北区| 哈尔滨市| 伊宁县| 连城县| 革吉县| 绍兴市| 库车县| 南岸区| 恭城| 于田县| 团风县| 南涧| 若尔盖县| 营山县| 油尖旺区| 米林县| 广宁县| 无为县| 昭平县|