mysql 技巧 * 慢查询及分析

概述

开启慢查询可以记录到耗时超过设定时间阀值 long_query_time 的语句,默认不开启。开启慢查询日志会或多或少带来一定的性能影响,建议仅调试时开启。

配置

通过 SHOW VARIABLES LIKE 'xxxx' 语句查看配置状态,如:

SHOW VARIABLES LIKE 'slow_query_log'

主要的配置:

  1. slow_query_log:是否开启慢查询日志,默认 OFF。
  2. long_query_time:慢查询阈值,当查询时间多于设定的阈值时,记录日志,默认 10s。
  3. slow_query_log_file:慢查询日志文件的保存路径。
  4. log_queries_not_using_indexes:是否将为使用索引的语句记录的慢查询日志,默认 OFF。

开启

临时开启(重启失效):

mysql> set global slow_query_log=1;
mysql> set global slow_query_log_file='D:\mysql-slow-query.log';
mysql> set global long_query_time=2;

永久开启(修改配置,重启生效):

# 在配置文件 [mysqld]下添加
slow_query_log=1;
slow_query_log_file=D:\mysql-slow-query.log;
long_query_time=2

慢查询语句

在千万级用户表中使用 join 语句,耗时15.25s:

SELECT u.id,username,c.coins FROM `users` u LEFT JOIN `test_user_coins` c ON u.id = user_id LIMIT 10;

慢查询日志记录:

以上重要参数:

  1. Query_time:执行时长,上例表现为 15.253022s。
  2. rows_examined:扫描的总行数,上例表现为 14201。

分析

在查询语句前加上 DESC 或 explain 可得到分析结果:

语句:

DESC SELECT u.id,username,c.coins FROM `users` u LEFT JOIN `test_user_coins` c ON u.id = user_id WHERE u.id < 10000 LIMIT 10;

结果:

分析:

关联表(test_user_coins)未使用索引,初步优化方案,给关联外键 (user_id)添加索引,结果如下:

耗时仅 0.001s ,索引的作用未免太过分了!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值