| 索引類型 | SQL 語法 | 約束特性 | 適用場景 |
|---|---|---|---|
| 主鍵索引 | ALTER TABLE t ADD PRIMARY KEY (col) | 唯一 + 非空 + 單表僅一個 | 業務主鍵,InnoDB 聚簇索引基礎 |
| 唯一索引 | ALTER TABLE t ADD UNIQUE idx_name (col) | 唯一,允許 NULL(多個 NULL) | 業務唯一鍵(身份證、手機、郵箱) |
| 普通索引 | ALTER TABLE t ADD INDEX idx_name (col) | 無約束,允許重複/NULL | 高頻查詢列、JOIN 關聯列 |
| 全文索引 | ALTER TABLE t ADD FULLTEXT idx_name (col) | MyISAM 5.6+ InnoDB 支持 | 長文本搜索(建議用 Elasticsearch 替代) |
| 組合索引 | ALTER TABLE t ADD INDEX idx_a_b_c (a,b,c) | 多列有序組合,遵循最左前綴 | 多條件組合查詢、覆蓋索引 |
-- 創建
CREATE UNIQUE INDEX idx_email ON users(email);
CREATE INDEX idx_name_city ON users(name(10), city); -- 指定前綴長度
-- 刪除
DROP INDEX idx_email ON users;
ALTER TABLE users DROP INDEX idx_email;
| 字段 | 類型 | 推薦索引 | 理由 |
|---|---|---|---|
| 會員編號 | INT | PRIMARY KEY | 業務主鍵,聚簇索引 |
| 會員姓名 | VARCHAR(10) | INDEX | 高頻模糊查詢,非唯一 |
| 身份證號 | VARCHAR(18) | UNIQUE | 業務唯一性約束 |
| 電話 | VARCHAR(11) | UNIQUE / INDEX | 登錄/查詢高頻,業務唯一 |
| 地址 | VARCHAR(50) | 無 | 低頻查詢,不建索引 |
| 備注信息 | TEXT | FULLTEXT (可選) | 長文本搜索需求時 |
SELECT * FROM myIndex
WHERE vc_Name='erquan' AND vc_City='鄭州' AND i_Age=25;
(vc_Name, vc_City, i_Age)、(vc_Name, vc_City)、(vc_Name)組合索引 (a,b,c) 可支持:
WHERE a = ? -- ✓ 用到 a
WHERE a = ? AND b = ? -- ✓ 用到 a,b
WHERE a = ? AND b = ? AND c = ? -- ✓ 用到 a,b,c
WHERE b = ? -- ✗ 無法用到 (非最左)
WHERE a = ? AND c = ? -- ✓ 僅用到 a (b 缺失中斷)
-- vc_Name 定長 50,實際值多數 < 10 字符
ALTER TABLE myIndex ADD INDEX idx_name_city_age (vc_Name(10), vc_City, i_Age);
-- 索引體積縮減,插入更新更快,查詢不受影響
=, >, <, >=, <=, BETWEEN, IN 可用索引LIKE 'prefix%' 可用索引,**LIKE '%suffix' 不能用索引**OR 兩側列**都有索引**才可能用索引,否則全表掃描ANALYZE TABLE 更新統計信息pt-duplicate-key-checker 檢測冗余/重複索引pt-index-usage 分析慢查詢日誌識別未用索引pt-online-schema-change 無鎖變更索引選型口訣:主鍵必建、唯一業務鍵建 UNIQUE、高頻查詢列建 INDEX、多條件組合查詢建組合索引遵循最左前綴、長文本慎用 FULLTEXT。定期審視索引使用情況,刪除未用索引,是持續優化的關鍵動作。