MySQL优化器优化

134 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

优化器-SQL语句优化

我们的服务层每天执行了这么多 SQL 语句,它怎么知道哪些 SQL 语句比较慢呢?

第一步,我们要把 SQL 执行情况记录下来。

慢查询日志 slow query log

dev.mysql.com/doc/refman/…

打开慢日志开关

因为开启慢查询日志是有代价的(跟 bin log、optimizer-trace 一样),所以它默认是关闭的:

show variables like 'slow_query%';

image.png

除了这个开关,还有一个参数,控制执行超过多长时间的 SQL 才记录到慢日志,默认是 10 秒。如果改成 0 秒的话就是记录所有的 SQL。

show variables like '%long_query%';

可以直接动态修改参数(重启后失效)。

set @@global.slow_query_log=1; -- 1 开启,0 关闭,重启后失效 
set @@global.long_query_time=3; -- mysql 默认的慢查询时间是 10 秒,另开一个窗口后才会查到最新值 
show variables like '%long_query%'; 
show variables like '%slow_query%';

或者修改配置文件 my.cnf。 以下配置定义了慢查询日志的开关、慢查询的时间、日志文件的存放路径。

slow_query_log = ON 
long_query_time=2 
slow_query_log_file =/var/lib/mysql/localhost-slow.log

模拟慢查询:

select sleep(10);

查询 user_innodb 表的 500 万数据(没有索引)。

SELECT * FROM `user_innodb` where phone = '136';

慢日志分析

  • 日志内容
show global status like 'slow_queries'; -- 查看有多少慢查询 
show variables like '%slow_query%'; -- 获取慢日志目录
cat /var/lib/mysql/ localhost-slow.log

image.png

  • mysqldumpslow

dev.mysql.com/doc/refman/…

MySQL 提供了 mysqldumpslow 的工具,在 MySQL 的bin目录下。

mysqldumpslow --help

例如:查询用时最多的 10 条慢 SQL:

mysqldumpslow -s t -t 10 -g 'select' /var/lib/mysql/localhost-slow.log

image.png

Count 代表这个 SQL 执行了多少次;

Time 代表执行的时间,括号里面是累计时间;

Lock 表示锁定的时间,括号是累计;

Rows 表示返回的记录数,括号是累计。