首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 普通索引 vs 唯一索引效能對比:B-Tree 結構、前綴索引陷阱、實測數據

     編輯:MySQL 資料庫相關知識

理論基礎

  • 兩者皆採用 **B+Tree** 結構。
  • 查詢時間複雜度均為 **O(log N)**。
  • 唯一索引額外約束:插入/更新時檢查重複值。

實測環境與結果

虛擬機測試,首次執行抓包截圖:

索引效能抓包

  • 多次執行取平均,**效能差異可忽略不計**。
  • 同一欄位同時建立唯一索引與普通索引時,優化器**自動選擇唯一索引**(選擇性更高)。

概念差異

特性普通索引 (KEY/INDEX)唯一索引 (UNIQUE)
允許重複值是否
NULL 值允許多個 NULL允許多個 NULL(MySQL 特有)
主要目的加速查詢業務唯一約束 + 加速查詢
維護開銷略低略高(檢查唯一性)

前綴索引陷阱(實測發現的關鍵差異來源)


-- 普通索引用了前綴(前 16 字節)
CREATE INDEX idx_name_prefix ON users(name(16));

-- 唯一索引用全欄位
CREATE UNIQUE INDEX uk_email ON users(email);

前綴索引導致選擇性下降、無法覆蓋查詢、LIKE 'prefix%' 仍可用但排序失效。**同一欄位比較時,必須對齊索引長度才公平**。

選擇建議

  1. **業務上必須唯一** → 唯一索引(資料完整性第一)。
  2. **允許重複** → 普通索引。
  3. **效能敏感且唯一** → 唯一索引(優化器偏好、統計資訊更準)。
  4. **長字串欄位** → 評估前綴索引長度(COUNT(DISTINCT LEFT(col, n))/COUNT(*) 接近 1 時可用)。
  5. **避免同欄位重複建立** 普通+唯一,浪費空間與寫入開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved