索引是有序數據結構(B+樹),加速查詢(WHERE/JOIN/ORDER BY/GROUP BY),但寫入時需維護順序,降低INSERT/UPDATE/DELETE性能。
黃金法則:大批量導入前刪除索引,導入後重建,避免逐行維護開銷。
| 類型 | 關鍵字 | 適用列 | 特點 | 引擎支持 |
|---|---|---|---|---|
| 普通索引 | INDEX | 任意 | 無約束,純加速查詢 | 所有 |
| 唯一索引 | UNIQUE INDEX | 任意 | 值唯一,允許一個NULL | 所有 |
| 主鍵索引 | PRIMARY KEY | 非空列 | 特殊唯一索引,聚簇索引 | 所有 |
| 全文索引 | FULLTEXT INDEX | CHAR/VARCHAR/TEXT | 自然語言搜索,5.6+ InnoDB支持 | MyISAM/InnoDB |
| 空間索引 | SPATIAL INDEX | GEOMETRY | GIS空間數據,列不可為NULL | MyISAM/InnoDB |
| 單列/多列 | - | - | 按列數分類,多列遵循最左前綴 | - |
CREATE TABLE t (
id INT,
name VARCHAR(20),
INDEX idx_name (name), -- 普通
UNIQUE INDEX uk_id (id), -- 唯一
FULLTEXT INDEX ft_info (info) -- 全文,需 ENGINE=MyISAM
);
CREATE INDEX idx_name ON t(name);
CREATE UNIQUE INDEX uk_course ON t(course_id);
CREATE FULLTEXT INDEX ft_info ON t(info);
ALTER TABLE t ADD INDEX idx_name (name(10)); -- 前綴索引
ALTER TABLE t ADD UNIQUE INDEX uk_id (id);
ALTER TABLE t ADD FULLTEXT INDEX ft_info (info);
INDEX idx_name (name(10)):僅索引前10字符,大幅縮小索引體積,適用於長字符串(URL、標題)。需評估選擇性:COUNT(DISTINCT LEFT(col,10))/COUNT(*)接近1時效果佳。
INDEX idx_a_b_c (a, b, c)等價於創建(a)、(a,b)、(a,b,c)三個索引。
查詢必須包含最左列a才能用到索引;WHERE b=1無法使用,WHERE a=1 AND c=3僅用到a。
查詢列全部包含在索引中,無需回表查聚簇索引。EXPLAIN顯示Using index,性能極佳。
DROP INDEX idx_name ON t; -- 普通/唯一/全文/空間通用
ALTER TABLE t DROP INDEX idx_name; -- 等價語法
DROP PRIMARY KEY ON t; -- 刪除主鍵
WHERE varchar_col = 123導致索引失效WHERE DATE(created_at) = '...'失效,改用範圍查詢%abc%失效,abc%可用索引設計是查詢模式驅動的,而非表結構驅動。根據EXPLAIN、慢查詢日誌、業務SQL持續迭代優化。