索引是資料庫效能調優的關鍵利器。本文系統梳理 MySQL 索引的建立語法、索引類型選擇、前綴索引應用以及刪除索引的操作,助您精準掌握索引管理核心技能。
SELECT 查詢效能,尤其在大數據量場景下效果顯著。CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name, ...)
[index_type]
| 參數 | 說明 |
|---|---|
UNIQUE | 建立唯一索引,索引值不可重複(允許 NULL) |
FULLTEXT | 建立全文索引,用於長文本搜尋(MyISAM/InnoDB 5.6+ 支援) |
SPATIAL | 建立空間索引,用於幾何資料類型(需支援空間擴充的引擎) |
index_name | 索引名稱,建議採用 idx_表名_欄位名 命名規範 |
index_type | 指定索引演算法:USING {BTREE | HASH | RTREE} |
index_col_name | col_name [(length)] [ASC | DESC],可指定前綴長度與排序方向 |
=、>、<、>=、<=、BETWEEN、LIKE 'prefix%' 等範圍查詢。=、<=>),記憶體表(MEMORY)預設使用,查詢極快但不支援範圍掃描。GEOMETRY、POINT 等)。對於 VARCHAR、TEXT、BLOB 等長字串欄位,建立全欄位索引會佔用大量空間且降低寫入效能。前綴索引只對欄位前 N 個字元建立索引:
-- 建立 email 欄位前 10 字元的索引
CREATE INDEX idx_email_prefix ON users (email(10));
選擇長度原則:透過 SELECT COUNT(DISTINCT LEFT(email, 10)) / COUNT(*) FROM users; 計算選擇度,當選擇度接近全欄位選擇度時,該長度即為最佳平衡點。
DROP INDEX index_name ON tbl_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;。pt-online-schema-change)。MySQL 無直接 ALTER INDEX 指令,修改索引通常採用「刪除舊索引 → 建立新索引」流程:
DROP INDEX idx_old ON tbl_name;
CREATE INDEX idx_new ON tbl_name (new_col_list);
大表修改索引時,建議使用 ALGORITHM=INPLACE 或線上工具避免長時間鎖表。
(a,b,c) 可支援 a、a,b、a,b,c 查詢,不可跳過欄位。ANALYZE TABLE 更新統計資訊,配合 SHOW INDEX 檢查基數。索引是把雙面刃,用得好查詢飛快,用不好寫入拖慢。深入理解語法與原理,結合業務查詢模式精準設計,才能發揮最大效能紅利。