0

0

mysql中分析慢查询日志进行索引优化

P粉602998670

P粉602998670

发布时间:2026-02-04 10:32:02

|

267人浏览过

|

来源于php中文网

原创

应重点查看慢查询日志中的Rows_examined和Rows_sent字段,若前者远大于后者(如124892 vs 10),说明存在索引缺失或失效;同时开启log_queries_not_using_indexes以捕获潜在风险语句。

mysql中分析慢查询日志进行索引优化

怎么看慢查询日志里真正耗时的 SQL?

MySQL 的慢查询日志(slow_query_log)默认只记录执行时间超过 long_query_time 的语句,但光看耗时容易误判——比如一条 SELECT 花了 2.3 秒,可能是因为没走索引全表扫描,也可能只是返回了 50 万行结果导致网络或客户端卡顿。

关键要看日志里的两个字段:Rows_examined(扫描行数)和 Rows_sent(返回行数)。如果前者远大于后者(比如 Rows_examined: 124892Rows_sent: 10),基本可以断定是索引缺失或失效。

  • 确保日志开启并记录足够信息:
    SET GLOBAL slow_query_log = ON;
    SET GLOBAL long_query_time = 1;
    SET GLOBAL log_queries_not_using_indexes = ON;
  • log_queries_not_using_indexes 很重要——它会把没走索引的查询也记进来,哪怕执行很快,这类语句在数据增长后极易变慢
  • mysqldumpslow 快速聚合分析,例如:
    mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log
    (按总耗时排序,取前 10 条)

EXPLAIN 看懂执行计划的关键指标

EXPLAIN 不是“看看就行”,要盯住几个硬指标:

  • type 字段:优先级从高到低是 consteq_ref > ref > range > index > ALL。出现 ALL 就是全表扫描,必须优化
  • key 字段:显示实际使用的索引名。如果是 NULL,说明没走索引(注意:也可能是用了索引但被优化器放弃,需结合 possible_keysExtra 判断)
  • Extra 字段:警惕 Using filesort(需要额外排序)和 Using temporary(临时表),尤其是二者同时出现,往往意味着 ORDER BY + GROUP BY 没命中索引覆盖

示例:对 orders 表查最近 7 天未支付订单

EXPLAIN SELECT * FROM orders 
WHERE status = 'pending' AND created_at > NOW() - INTERVAL 7 DAY;

typeALL,且 keyNULL,说明 statuscreated_at 缺少联合索引;建索引应按「等值条件在前、范围条件在后」原则:INDEX(status, created_at)

CG Faces
CG Faces

免费的 AI 人物图像素材网站

下载

联合索引顺序怎么排才不踩坑?

联合索引不是字段随便堆砌,顺序直接影响能否命中。核心规则就一条:等值查询字段放前面,范围查询字段放后面

  • 错误示范:INDEX(created_at, status) —— WHERE status = 'pending' AND created_at > '2024-01-01' 只能用上 status 的等值部分,created_at 的范围无法利用索引排序,type 仍可能是 range 或更差
  • 正确写法:INDEX(status, created_at) —— 等值 status 定位数据块,再在块内按 created_at 范围扫描,type 可达 range,且支持后续 ORDER BY created_at
  • 如果还有 ORDER BY user_id,且 user_id 是等值条件,可加到索引末尾:INDEX(status, created_at, user_id);但若 user_id 是范围或 IN 列表,则不能继续延伸索引

哪些情况加了索引也没用?

不是所有字段都适合建索引,有些场景建了反而拖慢写入、浪费空间,甚至让优化器选错执行路径:

  • 低区分度字段:比如 gender(只有 'M'/'F'),is_deleted(99% 是 0),索引选择性太差,优化器大概率直接全表扫描
  • 频繁更新的字段:每条 UPDATE 都要维护索引树,写入压力大时得权衡读写比
  • LIKE 左模糊:WHERE name LIKE '%abc' 无法使用索引;右模糊 'abc%' 可以,但中间模糊 '%abc%' 不行(除非用全文索引或倒排)
  • 隐式类型转换WHERE phone = 13800138000phoneVARCHAR),MySQL 会把字段转成数字比较,导致索引失效;应统一为字符串:WHERE phone = '13800138000'

最常被忽略的一点:索引列参与计算或函数,比如 WHERE YEAR(created_at) = 2024,哪怕 created_at 有索引也完全用不上。改写为范围查询:WHERE created_at >= '2024-01-01' AND created_at 才能走索引。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

813

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

351

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1366

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

365

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

963

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

427

2024.04.29

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

37

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.1万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 821人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号