MySQL 索引优化 + 慢查询日志

MySQL 索引优化 + 慢查询日志

运维必备 的 MySQL 性能优化核心知识点,分为索引优化 (从根源提速)和慢查询日志(定位慢 SQL)两部分。


一、MySQL 索引优化

索引的本质:通过排序 + 数据结构(B + 树)减少磁盘 IO,避免全表扫描,加速查询

1. 核心索引类型

索引类型 特点 适用场景
主键索引 唯一 + 非空,表默认索引 主键字段(id)
唯一索引 列值唯一,允许 NULL 手机号、订单号
普通索引 最基础,无约束 常规查询字段
复合索引 多列组合的索引 高频优先使用,替代多个单值索引
覆盖索引 查询的字段全部在索引中 避免回表,极致提速

2. 索引设计黄金原则

  1. 最左前缀原则(复合索引核心)

    复合索引 (a,b,c),生效场景:a / a,b / a,b,c,跳过 a 直接查 b/c索引失效

  2. 只为高频查询字段建索引

    出现在 WHERE/GROUP BY/ORDER BY/JOIN ON 中的字段。

  3. 只给区分度高的字段建索引

    性别、状态(0/1)这种低区分度字段,建索引无意义。

  4. 控制索引数量

    单表索引不超过 5 个,索引会拖慢INSERT/UPDATE/DELETE速度。

  5. 优先复合索引,避免大量单值索引

  6. 覆盖索引 ,杜绝SELECT *

3. 索引失效场景

只要出现以下情况,MySQL 会放弃索引,走全表扫描

  1. 违反最左前缀原则

  2. 索引列上做运算 / 函数 / 隐式类型转换

    例:age+1=18SUBSTR(name,1,2)='张'、字符串数字不加引号

  3. LIKE 左模糊查询

    例:LIKE '%张三'LIKE '张三%' 索引生效)

  4. OR 两边存在非索引字段

  5. 使用 != / NOT IN / NOT EXISTS / IS NULL

  6. 表数据量极小,优化器直接选择全表扫描

4. 索引优化实操工具

EXPLAIN 分析 SQL 执行计划

重点看 4 个字段:

  • type:查询类型,system > const > ref > range > index > ALL(ALL = 全表扫描,必须优化)
  • key:实际使用的索引(NULL = 未走索引)
  • rows:扫描的行数(越小越好)
  • ExtraUsing 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. 慢查询优化标准步骤

  1. 开启慢查询,捕获生产环境慢 SQL
  2. 用工具分析 :找出高频执行、耗时最长的核心 SQL
  3. EXPLAIN 分析:查看是否无索引 / 索引失效
  4. 针对性优化
    • 加索引 / 修复失效索引
    • 改写 SQL(减少 join、优化分页、避免 select*)
    • 调整业务逻辑
  5. 验证效果:重新执行 SQL,查看执行时间

4. 最常见的慢 SQL 原因

  1. 无索引、索引失效
  2. 分页太深:LIMIT 100000,10
  3. 多表JOIN过多(超过 3 张表)
  4. SELECT * 导致大量回表查询
  5. 锁等待、大事务阻塞

总结

  1. 索引优化 :遵守最左前缀、只为高频高区分度字段建索引、杜绝索引失效,用EXPLAIN验证
  2. 慢查询日志:开启后定位慢 SQL,先查索引问题,再优化 SQL,是性能调优的第一步
  3. 核心逻辑:索引解决「怎么快」,慢日志解决「哪里慢」,二者结合是 MySQL 性能优化的核心手段
相关推荐
Drache_long1 小时前
MySQL数据库(故障排除)
数据库·mysql
2303_821287381 小时前
如何清洗SQL输入数据_使用框架内置的ORM处理数据交互
jvm·数据库·python
清风雅雨1 小时前
AI编程:OA流程明细表中多个金额字段由整数改为2位小数
数据库·ai编程
菜鸟上路_lbz1 小时前
sqlserver存储过程查询缓慢锁表分析
数据库·sqlserver
Elastic 中国社区官方博客1 小时前
在 Elasticsearch 中使用利润率与流行度加权来优化电商搜索
大数据·数据库·elasticsearch·搜索引擎·全文检索
van久2 小时前
Day32:项目性能优化(EF Core + 分页 + 全异步)
数据库·oracle·性能优化
shaoming37762 小时前
浏览器动作开发:地址栏图标点击事件、弹出页面设计
android·mysql·adb
Dxy12393102162 小时前
Python请求方式介绍:JSON、表单及其他常见数据传输格式
数据库·python·json
环流_4 小时前
Redis中string类型的应用场景
数据库·redis·缓存