首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 索引核心概念:聚集索引與非聚集索引深度解析

     編輯:MySQL 綜合教學

一、核心定義

維度聚集索引非聚集索引
定義索引鍵值邏輯順序決定表數據行物理存儲順序僅對數據列建立索引,不影響表物理存儲順序
別名聚簇索引二級索引 / 輔助索引
每表數量最多 1 個可建多個
葉子節點內容完整行數據索引列值 + 主鍵值(回表查詢)

二、存儲引擎差異

  • InnoDB:索引組織表(IOT),主鍵即聚集索引。數據與主鍵 B+ 樹綁定存儲。
  • MyISAM:堆組織表(HOT),無聚集索引概念。數據按插入順序存儲,索引葉子節點存物理行指標。

三、InnoDB 聚集索引選擇規則

  1. 顯式定義的 PRIMARY KEY
  2. 第一個 NOT NULL UNIQUE 索引
  3. 內置隱藏列 ROWID(6 字節單調遞增)

因此:**InnoDB 表必須有主鍵,強烈建議使用自增整數主鍵**。

四、聚集索引 B+ 樹結構示意

[根節點] → [分支節點] → [葉子節點]
葉子節點 key = 主鍵值
葉子節點 value = 其餘列數據 + ROWID + rollback_pointer + trx_id

結論:InnoDB 表中,聚集索引即整張表,整張表即聚集索引。

五、IOT vs HOT 優劣勢對比

場景InnoDB (IOT)MyISAM (HOT)
範圍查詢極快(葉子節點鏈表順序讀取)需回表,隨機 I/O 多
頻繁更新不易產生碎片(主鍵不變)易產生行遷移、碎片
熱點數據適合小範圍高頻讀寫無優勢
主鍵訪問單次 B+ 樹查找直達數據需兩次查找(索引→數據)
離散寫入頁分裂頻繁,效能下降順序追寫,效能穩定
索引回表開銷無(主鍵查詢)大(每次需回表)

六、實戰建議

  1. InnoDB 表**必須顯式定義主鍵**,優先使用 BIGINT UNSIGNED AUTO_INCREMENT
  2. 避免使用 UUID、字串、複合主鍵作為聚集索引(導致頁分裂、二級索引膨脹)
  3. 二級索引盡量覆蓋查詢(Using index),減少回表
  4. 大批量導入數據時,按主鍵順序插入可顯著提速
  5. MyISAM 僅用於唯讀/歸檔表,InnoDB 為預設選擇

七、延伸閱讀

  • 《高效能 MySQL》第 3 章 索引優化
  • MySQL 官方文檔:InnoDB Index Types
  • Percona Blog: "Clustered Index vs Secondary Index in InnoDB"
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved