| 類型 | 關鍵字 | 特性 | 適用場景 |
|---|---|---|---|
| 普通索引 | INDEX / KEY | 無限制,允許 NULL、重複值 | 一般查詢加速 |
| 唯一索引 | UNIQUE INDEX | 值唯一,允許多個 NULL | 業務唯一鍵 (Email、手機、身分證) |
| 主鍵索引 | PRIMARY KEY | 唯一 + NOT NULL,表僅一個,InnoDB 聚簇索引 | 每張表必須,自增整數最佳 |
| 複合索引 | INDEX (a,b,c) | 多欄位組合,遵循最左前綴 | 多條件查詢、排序、分組 |
| 全文索引 | FULLTEXT INDEX | 支援自然語言/布林模式搜尋 | 文章、日誌、評論內容搜尋 |
| 空間索引 | SPATIAL INDEX | GIS 幾何資料類型 | 地理位置、幾何運算 |
-- 1. 建表時指定
CREATE TABLE t (
id INT PRIMARY KEY,
email VARCHAR(100),
name VARCHAR(20),
city VARCHAR(50),
UNIQUE INDEX uk_email (email),
INDEX idx_name_city (name(10), city)
) ENGINE=InnoDB;
-- 2. ALTER TABLE 新增 (線上 DDL 5.6+)
ALTER TABLE t ADD INDEX idx_city (city);
ALTER TABLE t ADD UNIQUE INDEX uk_phone (phone);
-- 3. CREATE INDEX (等同 ALTER TABLE)
CREATE INDEX idx_age ON t (age);
CREATE FULLTEXT INDEX ft_content ON t (content);
DROP INDEX idx_name ON t;
ALTER TABLE t DROP INDEX uk_email;
-- 主鍵刪除
ALTER TABLE t DROP PRIMARY KEY;
索引 INDEX idx_a_b_c (a, b, c) 等效於擁有:
(a)(a, b)(a, b, c)**可用**:WHERE a=1、WHERE a=1 AND b=2、WHERE a=1 AND b=2 AND c=3、ORDER BY a, b。
**不可用**:WHERE b=2、WHERE c=3、WHERE a=1 AND c=3 (跳過 b)。
-- VARCHAR(255) 欄位,前 10 字元區分度已達 95%+
ALTER TABLE t ADD INDEX idx_name_prefix (name(10));
優點:索引體積縮小 80%+,INSERT/UPDATE 更快,緩衝池容納更多索引頁。
查詢:WHERE name LIKE 'abc%' 可用,WHERE name LIKE '%abc' 不可用。
WHERE、JOIN ON、ORDER BY、GROUP BY 出現的欄位。LIKE 'prefix%' 可用索引,LIKE '%suffix' 無效。NOT NULL DEFAULT ''。WHERE YEAR(dt) < 2023 → WHERE dt < '2023-01-01'。NOT EXISTS 或 LEFT JOIN ... IS NULL。SELECT a,b FROM t WHERE c=1 建 INDEX (c,a,b),Extra 顯示 Using index。索引類型選擇口訣:主鍵必建、唯一業務鍵建 UNIQUE、多條件組合建複合、長字串用前綴、全文搜尋用 FULLTEXT。以 EXPLAIN 驗證生效,定期審視 sys.schema_unused_indexes 刪除無用索引,保持索引集合精簡高效。