無索引表 = 無序資料堆,查詢需全表掃描(Full Table Scan)。百萬筆資料查 10 筆,掃描 100 萬列極其浪費。
索引 = 已排序的查找表,包含索引鍵值與指向資料列的指標。查詢變為:
效能差異可達百倍以上。
| 類型 | 關鍵字 | 特性 | 適用場景 |
|---|---|---|---|
| 主鍵 | PRIMARY KEY | 唯一、非空、叢集索引(InnoDB) | 每張表必備 |
| 唯一 | UNIQUE | 值唯一、允許 NULL | Email、身分證、業務鍵 |
| 普通 | INDEX / KEY | 允許重複、允許 NULL | WHERE、JOIN、ORDER BY 常用欄位 |
| 全文 | FULLTEXT | 支援自然語言搜尋 | 文章、商品描述搜尋 |
| 空間 | SPATIAL | GIS 幾何資料 | 地理位置查詢 |
| 複合 | INDEX (a,b,c) | 最左前綴原則 | 多欄位組合查詢 |
INDEX (a,b,c) 支援 a、a,b、a,b,c,不支援 b、c、b,c。INDEX (name(10)) 減少索引體積,適用長字串欄位。| 錯誤寫法 | 原因 | 正確寫法 |
|---|---|---|
WHERE YEAR(create_time) = 2024 | 函數運算破壞索引順序 | WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01' |
WHERE name LIKE '%keyword%' | 前導萬用字元無法走索引 | 全文索引或 LIKE 'keyword%' |
WHERE varchar_col = 123 | 隱含型別轉換 | WHERE varchar_col = '123' |
WHERE a = 1 OR b = 2 | OR 兩側索引不同通常全掃 | 拆分 UNION ALL 或重設計 |
SELECT * FROM t WHERE indexed_col > 100 | 回表成本高,優化器選全掃 | 覆蓋索引 SELECT indexed_col ... 或評估是否需全欄位 |
ANALYZE TABLE 更新統計資訊,幫助優化器做正確決策。EXPLAIN SELECT ... 觀察 type(目標:ref/range/eq_ref)、key、rows、Extra(避免 Using temporary/filesort)。OPTIMIZE TABLE 整理碎片、重建索引統計。索引是查詢優化的第一優先級。先建對索引、寫對 SQL 讓索引生效,再談分區、快取、讀寫分離等進階手段。定期 EXPLAIN 核心查詢,持續迭代索引設計。