MySQL 索引优化 + 慢查询日志
运维必备 的 MySQL 性能优化核心知识点,分为索引优化 (从根源提速)和慢查询日志(定位慢 SQL)两部分。
一、MySQL 索引优化
索引的本质:通过排序 + 数据结构(B + 树)减少磁盘 IO,避免全表扫描,加速查询。
1. 核心索引类型
| 索引类型 | 特点 | 适用场景 |
|---|---|---|
| 主键索引 | 唯一 + 非空,表默认索引 | 主键字段(id) |
| 唯一索引 | 列值唯一,允许 NULL | 手机号、订单号 |
| 普通索引 | 最基础,无约束 | 常规查询字段 |
| 复合索引 | 多列组合的索引 | 高频优先使用,替代多个单值索引 |
| 覆盖索引 | 查询的字段全部在索引中 | 避免回表,极致提速 |
2. 索引设计黄金原则
-
最左前缀原则(复合索引核心)
复合索引
(a,b,c),生效场景:a/a,b/a,b,c,跳过 a 直接查 b/c索引失效。 -
只为高频查询字段建索引
出现在
WHERE/GROUP BY/ORDER BY/JOIN ON中的字段。 -
只给区分度高的字段建索引
性别、状态(0/1)这种低区分度字段,建索引无意义。
-
控制索引数量
单表索引不超过 5 个,索引会拖慢
INSERT/UPDATE/DELETE速度。 -
优先复合索引,避免大量单值索引
-
用覆盖索引 ,杜绝
SELECT *
3. 索引失效场景
只要出现以下情况,MySQL 会放弃索引,走全表扫描:
-
违反最左前缀原则
-
索引列上做运算 / 函数 / 隐式类型转换
例:
age+1=18、SUBSTR(name,1,2)='张'、字符串数字不加引号 -
LIKE左模糊查询例:
LIKE '%张三'(LIKE '张三%'索引生效) -
OR两边存在非索引字段 -
使用
!= / NOT IN / NOT EXISTS / IS NULL -
表数据量极小,优化器直接选择全表扫描
4. 索引优化实操工具
EXPLAIN 分析 SQL 执行计划
重点看 4 个字段:
type:查询类型,system > const > ref > range > index > ALL(ALL = 全表扫描,必须优化)key:实际使用的索引(NULL = 未走索引)rows:扫描的行数(越小越好)Extra:Using filesort/Using temporary严重性能问题,必须优化
二、MySQL 慢查询日志
慢查询日志:专门记录执行时间超过阈值的 SQL ,是定位性能瓶颈的唯一入口,默认关闭。
1. 慢查询核心配置
方式 1:永久配置(修改 my.cnf,重启 MySQL)
bash
[mysqld]
# 开启慢查询日志
slow_query_log = 1
# 慢查询日志存放路径
slow_query_log_file = /var/lib/mysql/slow.log
# 慢查询阈值:执行超过1秒的SQL记录(默认10秒)
long_query_time = 1
# 可选:记录未使用索引的SQL(排查索引问题)
log_queries_not_using_indexes = 1
方式 2:临时配置(无需重启,重启失效)
bash
-- 开启慢查询
SET GLOBAL slow_query_log = 1;
-- 设置阈值1秒
SET GLOBAL long_query_time = 1;
-- 指定日志文件
SET GLOBAL slow_query_log_file = '/var/lib/mysql/slow.log';
2. 慢查询分析工具
① 自带工具:mysqldumpslow(简单易用)
bash
# 查看耗时最长的10条SQL
mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log
# 常用参数
-s t # 按执行时间排序
-s c # 按执行次数排序
-t N # 取前N条
② 第三方工具:pt-query-digest(专业,推荐)
Percona 工具集,分析结果更详细,支持统计执行次数、总耗时、平均耗时。
3. 慢查询优化标准步骤
- 开启慢查询,捕获生产环境慢 SQL
- 用工具分析 :找出高频执行、耗时最长的核心 SQL
- EXPLAIN 分析:查看是否无索引 / 索引失效
- 针对性优化
- 加索引 / 修复失效索引
- 改写 SQL(减少 join、优化分页、避免 select*)
- 调整业务逻辑
- 验证效果:重新执行 SQL,查看执行时间
4. 最常见的慢 SQL 原因
- 无索引、索引失效
- 分页太深:
LIMIT 100000,10 - 多表
JOIN过多(超过 3 张表) SELECT *导致大量回表查询- 锁等待、大事务阻塞
总结
- 索引优化 :遵守最左前缀、只为高频高区分度字段建索引、杜绝索引失效,用
EXPLAIN验证 - 慢查询日志:开启后定位慢 SQL,先查索引问题,再优化 SQL,是性能调优的第一步
- 核心逻辑:索引解决「怎么快」,慢日志解决「哪里慢」,二者结合是 MySQL 性能优化的核心手段