索引是資料庫加速查詢的核心手段,尤其在多表聯查、大數據量過濾、排序分組場景下效果顯著。本文系統梳理 MySQL 索引特性、分類、建立/刪除語法、前綴索引策略,並對比 ISAM/MyISAM/InnoDB 差異,助你構建高效索引架構。
| 類型 | 關鍵字 | 唯一性 | NULL 允許 | 每表數量 | 典型場景 |
|---|---|---|---|---|---|
| 普通索引 | INDEX / KEY | 可重複 | 是 | 多個 | 一般查詢加速 |
| 唯一索引 | UNIQUE | 值不可重複 | 是 | 多個 | 業務鍵(如 email、身分證) |
| 主鍵索引 | PRIMARY KEY | 值不可重複 | 否 | 僅一個 | 實體識別、聚簇索引基礎 |
本質:PRIMARY KEY 只是名為 PRIMARY 的 UNIQUE 索引,且隱含 NOT NULL。
-- 單列普通索引
ALTER TABLE tbl ADD INDEX idx_name (col);
-- 多列複合索引
ALTER TABLE tbl ADD INDEX idx_multi (col1, col2, col3);
-- 唯一索引
ALTER TABLE tbl ADD UNIQUE uk_email (email);
-- 主鍵
ALTER TABLE tbl ADD PRIMARY KEY (id);
-- 刪除
ALTER TABLE tbl DROP INDEX idx_name;
ALTER TABLE tbl DROP PRIMARY KEY;
CREATE INDEX idx_name ON tbl (col);
CREATE UNIQUE INDEX uk_email ON tbl (email);
DROP INDEX idx_name ON tbl;
限制:無法建立 PRIMARY KEY;索引名不可省略。
CREATE TABLE tbl (
id INT NOT NULL,
name CHAR(30),
email VARCHAR(100),
PRIMARY KEY (id),
UNIQUE KEY uk_email (email),
INDEX idx_name (name(10)), -- 前綴索引:僅索引前 10 字元
INDEX idx_multi (name, email) -- 複合索引
);
col_name(prefix_length),如 name(10)。COUNT(DISTINCT LEFT(col, n)) / COUNT(*) ≈ 1 時,n 為最佳長度。SHOW INDEX FROM tbl\G
-- 關鍵欄位:Non_unique(0=唯一), Key_name, Seq_in_index(複合索引順序), Column_name, Cardinality(基數)
| 特性 | MyISAM | InnoDB |
|---|---|---|
| NULL 值索引 | 允許 | 允許 |
| BLOB/TEXT 索引 | 需前綴 | 需前綴 |
| 最大索引數 | 32 | 64 (5.7+) |
| 主鍵特性 | 非聚簇 | 聚簇索引(資料即索引) |
| 二級索引存儲 | 儲存行指標 | 儲存主鍵值(回表查詢) |
InnoDB 核心啟示:主鍵宜短(如自增整數),避免 UUID/長字串導致二級索引膨脹。
ANALYZE TABLE 更新統計資訊,配合 EXPLAIN 驗證執行計畫。