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

MySQL 索引使用機制深度分析:單列 vs 組合、最左前綴、覆蓋索引、LIKE 邊界、不足與代價

     編輯:MySQL 綜合教學

通過 testIndex / myIndex 兩張示例表,演示索引如何將「掃描 1000 行」降為「精準定位 1 行」,並對比單列索引、組合索引、最左前綴、覆蓋索引、LIKE 使用邊界、索引代價,建立直觀的索引效能模型。

一、 基礎驗證:索引加速 100 倍


CREATE TABLE testIndex (i_testID INT, vc_Name VARCHAR(16));
-- 插入 1000 行,其中一行 vc_Name='erquan'
SELECT * FROM testIndex WHERE vc_Name='erquan';
-- 無索引:掃描 1000 行
-- 有索引:直接定位,速度提升 100 倍

二、 單列索引 vs 組合索引實測


CREATE TABLE myIndex (
  i_testID INT PRIMARY KEY AUTO_INCREMENT,
  vc_Name VARCHAR(50), vc_City VARCHAR(50), i_Age INT, i_SchoolID INT
);
-- 5 條 vc_Name='erquan',city/age/school 組合各異
-- 查詢:WHERE vc_Name='erquan' AND vc_City='鄭州' AND i_Age=25
  • 單列索引 (vc_Name):鎖定 5 行 → 回表 → 過濾 city/age → 1 行。仍需回表 5 次。
  • 組合索引 (vc_Name(10), vc_City, i_Age):直接定位唯一行,零回表、零排序。
  • 三個單列索引:優化器只能選一個(通常 vc_Name),效率遠低於組合索引。

三、 組合索引 = 隱含多個前綴索引


INDEX idx_name_city_age (vc_Name(10), vc_City, i_Age)
-- 等價於同時擁有:
-- (vc_Name, vc_City, i_Age)
-- (vc_Name, vc_City)
-- (vc_Name)
-- 但 沒有 (vc_City, i_Age)、(vc_City)、(i_Age)

最左前綴 = B+Tree 字典序前綴有序。

四、 使用索引的條件邊界

五、 索引的代價(必讀)

  1. 寫入放大:每個索引都是獨立 B+Tree,INSERT/UPDATE/DELETE 需修改所有樹。
  2. 空間膨脹:大表多組合索引易超過數據本體大小。
  3. 維護開銷:統計信息收集、優化器評估、DDL 鎖定時間隨索引數增長。

結論:按查詢模式建最小必要索引集,單表 ≤ 6 個,定期 ANALYZE TABLE 更新統計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作符/函數能否用索引示例
=, <, >, <=, >=, BETWEEN, IN✅WHERE age BETWEEN 20 AND 30
LIKE 'abc%'✅後綴通配
LIKE '%abc%'❌前導通配
函數/表達式包裹列❌YEAR(dt)=2024
OR 連接不同列❌a=1 OR b=2