無索引時,三表連結 WHERE c1=c2 AND c1=c3 需掃描 10億種組合 (1000³)。有索引後,MySQL 只需全掃駕駛表 (t1),其餘表透過索引直接定位,速度提升百萬倍。
| 語法 | 適用索引類型 | 範例 |
|---|---|---|
ALTER TABLE tbl ADD INDEX idx_name (col_list) | 普通、UNIQUE、PRIMARY KEY | ALTER TABLE t ADD INDEX idx_name (name) |
CREATE INDEX idx_name ON tbl (col_list) | 普通、UNIQUE | CREATE INDEX idx_email ON users(email) |
CREATE TABLE ... INDEX idx_name (col_list) | 建表時同步建立 | 見下文 |
ALTER TABLE 可單語句建多個索引;CREATE INDEX 索引名不可省略;無法用 CREATE INDEX 建 PRIMARY KEY。
DROP INDEX idx_name ON tbl_name;
ALTER TABLE tbl_name DROP INDEX idx_name;
ALTER TABLE tbl_name DROP PRIMARY KEY; -- 僅刪主鍵
刪除組成複合索引的某欄位,該欄位自動從索引移除;全刪則整索引消失。
SHOW INDEX FROM tbl_name;
SHOW KEYS FROM tbl_name;
關鍵欄位:Non_unique (0=唯一)、Cardinality (基數估計值,越大越優)、Index_type (BTREE/FULLTEXT/HASH/RTREE)。
INDEX (a,b,c) 僅當 WHERE 條件包含 a、或 a+b、或 a+b+c 時生效。