索引是提升查詢性能的核心手段。本文系統講解 MySQL 5.0+ 支持的索引類型、創建/刪除語法、前綴索引策略、EXPLAIN 驗證與優化建議。
| 類型 | 關鍵字 | 特點 | 適用場景 |
|---|---|---|---|
| B-Tree 索引 | INDEX / KEY | 默認,支持 =、>、<、>=、<=、BETWEEN、LIKE 'prefix%' | 通用查詢 |
| 哈希索引 | USING HASH | 僅支持 =、IN、<=>,極快,MEMORY 引擎默認 | 精確查找 |
| 全文索引 | FULLTEXT | 自然語言/布爾模式搜索,MyISAM/InnoDB 5.6+ | 文本搜索 |
| 空間索引 | SPATIAL | 地理空間數據,不允許 NULL | GIS 應用 |
| 前綴索引 | col(n) | 索引前 n 字符/位元組,節省空間 | 長字符串列 |
ALTER TABLE table_name
ADD [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
[USING {BTREE | HASH}]
(col_name[(length)] [ASC | DESC], ...);
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
ON table_name (col_name[(length)] [ASC | DESC], ...)
[USING {BTREE | HASH}];
CREATE TABLE t (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100),
content TEXT,
INDEX idx_name (name),
UNIQUE uk_email (email),
FULLTEXT ft_content (content)
);
-- 計算不同前綴長度的選擇性
SELECT
COUNT(DISTINCT LEFT(col, 10)) / COUNT(*) AS sel_10,
COUNT(DISTINCT LEFT(col, 20)) / COUNT(*) AS sel_20,
COUNT(DISTINCT LEFT(col, 50)) / COUNT(*) AS sel_50
FROM table_name;
-- 選擇性接近 1.0 (如 0.99+) 時的長度即為最佳
-- city 表 city 列創建前綴索引長度 2
ALTER TABLE city ADD INDEX idx_city_prefix (city(2));
-- 驗證使用
EXPLAIN SELECT * FROM city WHERE city = 'Beijing'\G
-- 關鍵輸出: key=idx_city_prefix, rows=1
ORDER BY、GROUP BY 優化LIKE '%suffix' 仍無法使用-- ALTER TABLE 方式
ALTER TABLE table_name DROP INDEX index_name;
-- DROP INDEX 方式 (MySQL 特有別名)
DROP INDEX index_name ON table_name;
-- 刪除主鍵
ALTER TABLE table_name DROP PRIMARY KEY;
CREATE TABLE city (
id INT PRIMARY KEY AUTO_INCREMENT,
city VARCHAR(100),
country_code CHAR(3),
population INT
);
-- 1. 高頻精確查詢: 城市名
ALTER TABLE city ADD INDEX idx_city (city);
-- 2. 篩選+排序: 國家+人口
ALTER TABLE city ADD INDEX idx_country_pop (country_code, population);
-- 3. 長文本搜索: 城市描述 (假設有 description TEXT)
ALTER TABLE city ADD FULLTEXT ft_desc (description);
-- 4. 驗證各查詢計劃
EXPLAIN SELECT * FROM city WHERE city = 'Shanghai'\G
EXPLAIN SELECT * FROM city WHERE country_code = 'CN' ORDER BY population DESC\G
EXPLAIN SELECT * FROM city WHERE MATCH(description) AGAINST('+river' IN BOOLEAN MODE)\G
MySQL 不支持原地修改索引定義,需
DROP + ADD。
ALTER TABLE city
DROP INDEX idx_city,
ADD INDEX idx_city_new (city(10));
sys.schema_unused_indexes (8.0+)掌握索引創建語法、前綴索引選擇科學方法、EXPLAIN 驗證技巧,能精準解決查詢性能瓶頸。