mysql小记-分析SQL执行效率

本文详细介绍了如何定位和分析MySQL的慢查询日志,包括如何开启慢查询日志、设置阈值、获取日志路径和文件名,以及使用show processlist、explain、show profile和trace等工具进行查询优化。建议线上环境将long_query_time设为1秒,测试环境可更低,以提早发现并优化性能问题。
摘要由CSDN通过智能技术生成

定位慢 SQL

慢查询日志

  • MySQL 的慢查询日志用来记录在 MySQL 中响应时间超过参数 long_query_time(单位秒,默认值 10)设置的值并且扫描记录数不小于 min_examined_row_limit(默认值 0)的语句
  • 默认情况下,也不会记录查询时间不超过 long_query_time 但是不使用索引的语句,可通过配置 log_queries_not_using_indexes = on 让不使用索引的 SQL 都被记录到慢查询日志中
  • 开启慢查询日志
set global slow_query_log = on;
  • 设置慢查询时间阀值
    • 线上业务一般建议把 long_query_time 设置为 1 秒,如果某个业务的 MySQL 要求比较高的 QPS,可设置慢查询为 0.1 秒
    • 一般测试环境建议 long_query_time 设置的阀值比生产环境的小,比如生产环境是 1 秒,则测试环境建议配置成 0.5 秒
    • 某些重要业务测试环境 long_query_time 可以设置为 0,以便记录所有语句。重点关注 Rows_examined(语句执行期间从存储引擎读取的行数),提前优化
set global long_query_time = 1;
  • 获取慢查询日志的路径
show global variables like "datadir";
  • 获取慢查询日志的文件名
show global variables like "slow_query_log_file";

通过 show processlist

  • show processlist 命令判断正在执行的慢查询

explain 分析慢查询

  • 在查询语句前面加上 explain 运行

show profile 分析慢查询

  • 通过配置参数 profiling = 1 来启用 SQL 分析,该参数开启后,后续执行的 SQL 语句都将记录其资源开销,如 IO、上下文切换、CPU、Memory等
  • 判断当前 MySQL 是否支持 profile
select @@have_profiling;
  • 查看 profiling 是否关闭
select @@profiling;
  • 开启 profile,set 时没加 global,只对当前 session 有效
set profiling=1;
  • 执行 SQL 语句
  • show profiles 语句确定执行过的 SQL 的 query id
  • 查询 SQL 执行详情
show profile for query 1;

trace 分析 SQL 优化器

  • 使用 trace 查看优化器如何选择执行计划
  • 开启该功能,会对 MySQL 性能有所影响,因此只建议分析问题时临时开启
  • 开启 trace,设置格式为 JSON
set session optimizer_trace="enabled=on",end_markers_in_json=on;
  • 执行sql
  • 分析trace
SELECT * FROM information_schema.OPTIMIZER_TRACE

相关链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值