通過 testIndex / myIndex 兩張示例表,演示索引如何將「掃描 1000 行」降為「精準定位 1 行」,並對比單列索引、組合索引、最左前綴、覆蓋索引、LIKE 使用邊界、索引代價,建立直觀的索引效能模型。
CREATE TABLE testIndex (i_testID INT, vc_Name VARCHAR(16));
-- 插入 1000 行,其中一行 vc_Name='erquan'
SELECT * FROM testIndex WHERE vc_Name='erquan';
-- 無索引:掃描 1000 行
-- 有索引:直接定位,速度提升 100 倍
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
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 字典序前綴有序。
| 操作符/函數 | 能否用索引 | 示例 |
|---|---|---|
| =, <, >, <=, >=, BETWEEN, IN | ✅ | WHERE age BETWEEN 20 AND 30 |
| LIKE 'abc%' | ✅ | 後綴通配 |
| LIKE '%abc%' | ❌ | 前導通配 |
| 函數/表達式包裹列 | ❌ | YEAR(dt)=2024 |
| OR 連接不同列 | ❌ | a=1 OR b=2 |