索引是資料庫效能的核心。MySQL 支援多種索引類型,合理設計與維護索引能讓查詢速度提升數量級。本文系統梳理六大索引類型、建立語法、前綴索引、刪除/修改/查看操作,並給出實戰優化建議。
| 類型 | 關鍵字 | 特點 | 適用場景 |
|---|---|---|---|
| 普通索引 | KEY / INDEX | 僅加速查詢,允許重複值與 NULL | WHERE、ORDER BY、JOIN 條件欄位 |
| 唯一索引 | UNIQUE | 值必須唯一(允許單個 NULL),簡化管理、提高效率、自動防重 | 業務鍵:身分證、郵箱、手機號 |
| 主鍵索引 | PRIMARY KEY | 特殊唯一索引,不允許 NULL,每表僅一個,InnoDB 叢集索引 | 表主鍵,必建 |
| 外鍵索引 | FOREIGN KEY | 自動建立內部索引輔助約束檢查 | 關聯完整性要求高的場景 |
| 複合索引 | INDEX(col_a, col_b) | 多欄組合,遵循「最左前綴原則」:可用於 col_a、 (col_a, col_b),不可用於 col_b、 (col_b, col_c) | 多欄組合查詢、排序、分組 |
| 全文索引 | FULLTEXT | 針對長文本分詞建立倒排索引,支援自然語言/布爾模式搜尋,MyISAM/InnoDB 5.6+ 支援 | 文章搜尋、日誌分析、內容檢索 |
CHAR/VARCHAR:可指定前綴長度(如 username(10)),節省空間、提升插入速度,通常 10~15 字元足夠區分度BLOB/TEXT:必須 指定前綴長度,最大 255 字元(MyISAM/InnoDB 可至 1000 位元組)CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON table_name (index_col_name, ...)
-- 等價 ALTER TABLE 寫法
ALTER TABLE table_name
ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name (index_col_name, ...) [USING index_type]
index_type:BTREE(預設,MyISAM/InnoDB 僅支援)、HASH(MEMORY/HEAP 表可選)index_col_name:欄位名,多欄用逗號分隔建立複合索引;col_name(length) 指定前綴長度-- 普通索引
CREATE INDEX idx_user_username ON user (username(6));
-- 唯一索引
CREATE UNIQUE INDEX uk_user_email ON user (email);
-- 複合索引(遵循最左前綴)
CREATE INDEX idx_order_user_status ON orders (user_id, status, created_at);
-- 全文索引(需 MyISAM 或 InnoDB 5.6+)
ALTER TABLE articles ADD FULLTEXT INDEX ft_content (title, body);
ALTER TABLE table_name DROP INDEX index_name;
-- 範例
ALTER TABLE user DROP INDEX idx_user_username;
MySQL 無直接修改指令,標準做法:先刪除舊索引,再建立同名新索引。
ALTER TABLE user DROP INDEX idx_user_username;
CREATE INDEX idx_user_username ON user (username(8));
SHOW INDEX FROM table_name [FROM db_name];
-- 或
SHOW INDEX FROM [db_name.]table_name
| 欄位 | 含義 |
|---|---|
| Table | 表名 |
| Non_unique | 0=唯一,1=非唯一 |
| Key_name | 索引名 |
| Seq_in_index | 索引中欄位順序(1 起) |
| Column_name | 欄位名 |
| Collation | 排序方式(A=升序,NULL=不排序) |
| Cardinality | 基數(不重複值估計),越大選擇性越高 |
| Sub_part | 前綴長度,NULL 表全欄位 |
| Index_type | BTREE / FULLTEXT / HASH 等 |
| Comment | 備註 |
EXPLAIN 顯示 Using indexLIKE '%abc' 導致全表掃描OR 條件未全命中索引ANALYZE TABLE 更新基數統計,OPTIMIZE TABLE 整理碎片sys.schema_unused_indexes(MySQL 5.7+)識別可刪除索引,減少寫入開銷索引設計是「藝術與科學的平衡」。理解六大類型特性、掌握建立/維護語法、遵循最左前綴與覆蓋索引原則、建立定期分析機制,即可讓 MySQL 在海量資料下依然保持毫秒級響應。建議將索引變更納入上線審核清單,上線前必做 EXPLAIN 驗證執行計畫。