索引是查詢效能的命脈。MySQL 提供 CREATE INDEX、ALTER TABLE ... ADD INDEX、DROP INDEX、SHOW INDEX 等命令管理索引全生命週期。本文系統整理四大核心操作語法、參數詳解、聯合索引設計原則、覆蓋索引驗證與常見誤區。
-- 普通索引
ALTER TABLE `table_name` ADD INDEX `idx_name` (col1, col2);
-- 唯一索引
ALTER TABLE `table_name` ADD UNIQUE `uk_name` (col1, col2);
-- 主鍵索引
ALTER TABLE `table_name` ADD PRIMARY KEY `pk_name` (col1);
-- 範例:文章表加索引
ALTER TABLE `article` ADD INDEX `idx_id` (`id`);
ALTER TABLE `article` ADD INDEX (`id`, `order_id`);
CREATE INDEX `idx_name` ON `table_name` (col_list);
CREATE UNIQUE INDEX `uk_name` ON `table_name` (col_list);
-- 無法建立 PRIMARY KEY
CREATE TABLE t_order (
id BIGINT PRIMARY KEY,
user_id BIGINT,
status TINYINT,
INDEX idx_user_status (user_id, status),
UNIQUE uk_order_no (order_no)
) ENGINE=InnoDB;
SHOW INDEX FROM `table_name`;
-- 或
SHOW KEYS FROM `table_name`;
| 欄位 | 含義 |
|---|---|
| Table | 表名 |
| Non_unique | 0=唯一,1=非唯一 |
| Key_name | 索引名(主鍵為 PRIMARY) |
| Seq_in_index | 索引內欄位順序(從 1 開始) |
| Column_name | 欄位名 |
| Collation | A=升序,NULL=無排序 |
| Cardinality | 不重複值估算(基數),越大選擇性越高 |
| Sub_part | 前綴索引長度,NULL=全欄位 |
| Packed | 壓縮方式,NULL=無 |
| Null | YES/NO 是否允許 NULL |
| Index_type | BTREE, FULLTEXT, HASH, RTREE |
| Comment | 備註 |
索引碎片、統計資訊過舊會導致優化器誤判。重建方式:
-- 1. REPAIR TABLE (僅 MyISAM,InnoDB 無效)
REPAIR TABLE tbl_name QUICK;
-- 2. ALTER TABLE ... DROP INDEX + ADD INDEX (通用,重建表)
ALTER TABLE tbl_name DROP INDEX idx_name, ADD INDEX idx_name (col_list);
-- 3. OPTIMIZE TABLE (重建表、整理碎片、更新統計)
OPTIMIZE TABLE tbl_name;
-- 4. ANALYZE TABLE (僅更新統計資訊,不重建)
ANALYZE TABLE tbl_name;
生產大表重建索引請用 pt-online-schema-change 或 gh-ost,避免鎖表。
-- ALTER TABLE 方式(推薦、可批次)
ALTER TABLE `table_name` DROP INDEX `idx_name`;
ALTER TABLE `table_name` DROP UNIQUE `uk_name`;
ALTER TABLE `table_name` DROP PRIMARY KEY; -- 主鍵無需指定名
-- DROP INDEX 方式
DROP INDEX `idx_name` ON `table_name`;
(a,b,c) 支援 a、a,b、a,b,c。SELECT a,b FROM t WHERE c=1 → 索引 (c,a,b) 避免回表。ANALYZE TABLE 更新 Cardinality。索引管理核心四招:**ALTER TABLE ADD INDEX 建立、SHOW INDEX 查詢、OPTIMIZE/ANALYZE 重建統計、ALTER TABLE DROP INDEX 刪除**。聯合索引遵循最左前綴,覆蓋索引消除回表,大表變更用線上工具。將索引審核納入上線流程(EXPLAIN 必過),是穩定查詢效能的關鍵。