📌 一、常见的索引类型
| 索引类型 | 描述 |
|---|---|
| 🔑 PRIMARY KEY | 主键索引,唯一且不允许为 NULL。一张表只能有一个主键。 |
| 🔐 UNIQUE | 唯一索引,列值必须唯一,但可以为 NULL。 |
| 📘 INDEX / KEY | 普通索引,加速查询,但不强制唯一性。 |
| 🔍 FULLTEXT | 全文索引,用于 TEXT 类型字段的全文搜索。 |
| 🌐 SPATIAL | 空间索引,用于 GIS 数据类型(如 POINT、GEOMETRY)。 |
🛠️ 二、创建索引语法
-- 创建普通索引
CREATE INDEX idx_column ON table_name(column_name);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique ON table_name(column_name);
-- 添加主键索引
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
-- 创建复合索引(多列组合)
CREATE INDEX idx_multi ON table_name(column1, column2);
✅ 三、索引的优势
- 🚀 提升查询性能:加快
SELECT查询的速度。 - 🔐 唯一性约束:如
UNIQUE、PRIMARY KEY确保数据唯一。 - 🧩 加速连接操作:提高
JOIN的匹配效率。 - 📊 优化排序/分组:加速
ORDER BY、GROUP BY操作。 - 🔎 提高数据定位效率:减少扫描行数。
⚠️ 四、索引的代价(缺点)
- 🧠 增加存储开销:每个索引都需要额外的磁盘空间。
- 🐢 插入/更新/删除变慢:每次数据变更都需更新索引。
- 🧭 维护成本高:过多或无用索引反而拖慢性能。
💡 五、适用场景
WHERE子句中频繁使用的字段JOIN条件中的字段- 排序(
ORDER BY)和分组(GROUP BY)字段 - 需要唯一性的字段(如用户邮箱、用户名)
- 高并发读取的数据表
🔍 六、查看与删除索引
-- 查看某表的所有索引
SHOW INDEX FROM table_name;
-- 删除索引(非主键)
DROP INDEX idx_name ON table_name;
-- 删除主键索引
ALTER TABLE table_name DROP PRIMARY KEY;
❗ 七、索引失效的常见原因
| 场景 | 描述 |
|---|---|
| 使用函数 | 例:WHERE YEAR(birthdate) = 2020,索引失效 |
| 模糊匹配前缀 | 例:LIKE '%abc',不能使用索引 |
| 数据类型不一致 | 如 WHERE id = '123',若 id 是整型,可能触发隐式转换 |
| 未使用最左前缀 | 对复合索引未按顺序使用,无法命中索引 |
| 使用 OR 条件 | 某些 OR 查询不能使用多个字段的联合索引 |
📎 建议:配合 EXPLAIN 分析查询计划,判断是否使用了索引。
EXPLAIN SELECT * FROM table_name WHERE column = 'value';
正文完