索引在存儲引擎層實現,不同引擎支持的索引類型、最大數量、長度限制各異。所有引擎至少支持:
MySQL 索引存儲類型:
| 引擎 | 支持索引類型 |
|---|---|
| MyISAM / InnoDB | BTREE |
| MEMORY / HEAP | HASH、BTREE |
| 優點 | 缺點 |
|---|---|
| 唯一索引保證數據唯一性 | 寫操作 (INSERT/UPDATE/DELETE) 需維護索引,降低寫性能 |
| 大幅加速查詢 (WHERE/JOIN/ORDER BY/GROUP BY) | 佔用額外磁盤空間,索引文件可能比數據文件更大 |
| 覆蓋索引避免回表 | 索引選擇性低時優化器可能放棄使用 |
CREATE TABLE table_name (
col_name data_type,
[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name[(length)]) [ASC|DESC]
);
INDEX 和 KEY 同義length 僅字符串類型可指定 (前綴索引)ASC/DESC 指定索引排序方向 (InnoDB 8.0+ 真正支持降序)CREATE TABLE book (
bookid INT NOT NULL,
bookname VARCHAR(255) NOT NULL,
authors VARCHAR(255) NOT NULL,
info VARCHAR(255) NULL,
comment VARCHAR(255) NULL,
year_publication YEAR NOT NULL,
INDEX (year_publication)
) ENGINE=MYISAM;
驗證:
SHOW CREATE TABLE book;
EXPLAIN SELECT * FROM book WHERE year_publication=1990;

| 列 | 含義 |
|---|---|
| type | 訪問類型:ALL(全掃) > index > range > ref > eq_ref > const > system (性能遞增) |
| possible_keys | 理論可用索引 |
| key | 實際使用索引 |
| key_len | 索引使用字節數 |
| rows | 預估掃描行數 |
| Extra | Using index (覆蓋索引)、Using where、Using filesort 等 |
CREATE TABLE t1 (id INT NOT NULL, name CHAR(30) NOT NULL, UNIQUE INDEX UniqIdx(id));
CREATE TABLE t3 (id INT, name CHAR(30), age INT, info VARCHAR(255), INDEX MultiIdx(id, name, age));
-- 命中索引
EXPLAIN SELECT * FROM t3 WHERE id=1 AND name='小芳';
-- 未命中 (未使用最左列)
EXPLAIN SELECT * FROM t3 WHERE name='小芳';

CREATE TABLE t4 (id INT, info VARCHAR(255), FULLTEXT INDEX FulltxtIdx(info)) ENGINE=MYISAM;
CREATE TABLE t5 (g GEOMETRY NOT NULL, SPATIAL INDEX spatIdx(g)) ENGINE=MYISAM;
-- 添加
ALTER TABLE t1 ADD INDEX NameIdx(name);
ALTER TABLE t3 ADD INDEX t3AgeAndInfo(age, info);
ALTER TABLE t6 ADD FULLTEXT INDEX infoFTIdx(info);
ALTER TABLE t7 ADD SPATIAL INDEX spatIdx(g);
-- 刪除
ALTER TABLE book DROP INDEX UniqidIdx;
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX idx_name ON tbl_name(col_name[(len)]);
DROP INDEX idx_name ON tbl_name;
SHOW INDEX FROM t3;
| 列 | 含義 |
|---|---|
| Non_unique | 0=唯一,1=非唯一 |
| Key_name | 索引名 |
| Seq_in_index | 列在索引中順序 |
| Column_name | 索引列 |
| Sub_part | 前綴長度 (NULL=全列) |
| Null | 是否允許 NULL |
| Index_type | BTREE/HASH/FULLTEXT/SPATIAL |

Using index