【实战指南】MySQL索引最全使用手册,附优化原则与性能对比
【MySQL索引极简指南】索引如同书籍目录,可加速查询。主要类型:普通索引(加速查询)、唯一索引(保证唯一性)、主键索引(唯一标识)、组合索引(多字段查询)。创建方式包括建表时、后期添加和修改表结构。建议为高频查询字段(WHERE/JOIN/排序)加索引,避免给小表/频繁更新/低区分度字段加索引。组合索引需遵循最左前缀原则。管理命令包括查看/删除/重建索引。常见错误:过度索引和无效索引。最佳实践是
MySQL 索引极简教程
一、什么是索引?
索引就像书的目录:没有索引需要整本书翻找,有索引可以快速定位。
二、索引类型速查
| 索引类型 | 用途 | 示例 | |||| | 普通索引 | 加速查询 | name
字段 | | 唯一索引 | 保证唯一性 | email
字段 | | 主键索引 | 唯一标识 | id
字段 | | 组合索引 | 多字段查询 | (city, age)
|
三、创建索引(3种方式)
- 建表时创建
CREATE TABLE users (
id INT PRIMARY KEY, -- 主键索引
name VARCHAR(50) INDEX, -- 普通索引
email VARCHAR(100) UNIQUE, -- 唯一索引
age INT,
KEY idx_age (age) -- 命名索引
);
- 后期添加(最常用)
-- 普通索引
CREATE INDEX idx_name ON users(name);
-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 组合索引
CREATE INDEX idx_city_age ON users(city, age);
- 修改表结构
ALTER TABLE users ADD INDEX idx_name (name);
四、应该给哪些字段加索引?
✅ 推荐加索引:
- WHERE 条件字段:
WHERE status = 'active'
- JOIN 连接字段:
ON users.id = orders.user_id
- 排序字段:
ORDER BY created_at DESC
- 经常查询的组合字段
❌ 不建议加索引:
- 数据量很小的表
- 频繁更新的字段
- 区分度低的字段(如:性别、状态)
五、实战示例
场景:用户查询优化
-- 查询慢:需要全表扫描
SELECT * FROM users WHERE city = '北京' AND age > 25;
-- 解决方案:添加组合索引
CREATE INDEX idx_city_age ON users(city, age);
-- 再查询:速度飞快!
查看索引效果
-- 查看执行计划
EXPLAIN SELECT * FROM users WHERE city = '北京' AND age > 25;
-- 查看表索引
SHOW INDEX FROM users;
六、组合索引使用技巧
正确使用(最左前缀原则)
-- 索引:idx_city_age_gender
CREATE INDEX idx_city_age_gender ON users(city, age, gender);
-- ✅ 这些查询能用索引:
WHERE city = '北京'
WHERE city = '北京' AND age > 25
WHERE city = '北京' AND age = 30 AND gender = 'M'
-- ❌ 这些查询不能用索引:
WHERE age > 25 -- 缺少 city
WHERE city = '北京' AND gender = 'M' -- 缺少 age
七、索引管理命令
查看索引
SHOW INDEX FROM table_name;
删除索引
DROP INDEX index_name ON table_name;
重建索引(优化性能)
ALTER TABLE table_name ENGINE=InnoDB;
八、常见错误
- 索引过多
-- 错误:每个字段都建索引
CREATE INDEX idx_name ON users(name);
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_phone ON users(phone);
-- 结果:写操作变慢,磁盘占用大
- 无效索引
-- 索引:idx_city_age
CREATE INDEX idx_city_age ON users(city, age);
-- ❌ 错误用法
WHERE age > 25 -- 无法使用索引(违反最左前缀)
九、性能检查清单
创建索引前问自己:
- [ ] 这个字段经常在 WHERE 中使用吗?
- [ ] 表的数据量是否足够大(>1万条)?
- [ ] 字段的区分度是否足够高?
- [ ] 是否会影响写操作性能?
创建索引后检查:
- [ ] 使用 EXPLAIN 验证索引效果
- [ ] 查询速度是否明显提升?
- [ ] 写操作性能是否可以接受?
十、一句话总结
索引 = 用空间换时间
- 空间:占用磁盘,降低写入速度
- 时间:极大提升查询速度
最佳实践:在频繁查询的字段上创建索引,但不要过度索引。
快速开始
- 找出慢查询:
SHOW PROCESSLIST;
- 分析执行计划:
EXPLAIN SELECT ...
- 创建合适索引:
CREATE INDEX idx_name ON table(column)
- 验证效果:再次执行
EXPLAIN
按照这个指南,你可以在5分钟内为MySQL表添加合适的索引,让查询速度提升10倍以上! 另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。
更多推荐
所有评论(0)