Mysql 慢查询SQL优化最全教程

  • MysQL 的慢查询日志是 MySQL 提供的一种日志记录,它用来记录在 My sQL 中响应时间超过阈值的语句,具体指运行时间超过 long_query_time 值的SQL,则会被记录到慢查询日志中
  • long_query_time 的默认值为10,意思是运行10秒以上的语句
  • 由慢查询日志来查看哪些 SQL 超出了我们的最大忍耐时间值,比如一条SQL执行超过5秒钟,我们就算慢 SQL,希望能收集超过5秒钟的 SQL,结合explain 进行全面分析

特别说明

默认情况下,MysQL 数据库没有开启慢查询日志,需要我们手动来设置这个参数

当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件

慢日志常用的配置
slow_query_log       是否启用慢查询日志,默认为0,可设置为0、1,1表示开启。
slow_query_log_file  指定慢查询日志位置及名称,默认值为host_name-slow.log,可指定绝对路径。
long_query_time      慢查询执行时间阈值,超过此时间会记录,默认为10,单位为s。
log_output           慢查询日志输出目标,默认为file,即输出到文件。
log_timestamps       主要是控制 error log、slow log、genera log 日志文件中的显示时区,默认使用UTC时区,建议改为 SYSTEM 系统时区。
log_queries_not_using_indexes    是否记录所有未使用索引的查询语句,默认为off。
min_examined_row_limit           对于查询扫描行数小于此参数的SQL,将不会记录到慢查询日志中,默认为0。
log_slow_admin_statements        慢速管理语句是否写入慢日志中,管理语句包含 alter table、create index 等,默认为 off 即不写入

查看是否开启慢查询日志

show variables like '%slow_query_log%';

开启慢查询-临时 当前会话有效

set global slow_query_log='ON';

如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)。

my.cnf要增加或修改参数slow_query_log 和slow_query_log_file,如下所示:

slow_query_log = 1
slow_query_log_file = /tmp/mysql_slow.log

查看慢查询日志存放文件位置

show variables like '%slow_query_log_file%';

查看long_query_time阈值

show variables like '%long_query_time%';

设置long_query_time阈值—临时的,当前会话有效。时间根据自己需求设置

set global long_query_time=3

查询和设置log_output-(参数指定日志的存储方式)

log_output=‘FILE’表示将日志存入文件,默认值也是’FILE’。

log_output='TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。

同时也支持两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=‘FILE,TABLE’。不过为了性能考虑建议优先写入到文件中
查询

show variables like '%log_output%';

设置

set global log_output='TABLE';

可以直接sql查询慢sql

select * from mysql.slow_log;

查询和设置log_queries_not_using_indexes-可选项-如果调优的话,建议开启这个选项。

该系统变量指定未使用索引的查询也被记录到慢查询日志中。

查询:

show variables like 'log_queries_not_using_indexes';

设置开启

set global log_queries_not_using_indexes=1;

查询有多少条慢SQL查询日志-Slow_queries

show global status like '%Slow_queries%';

在 MySQL 中,慢查询日志中默认不记录管理语句,如:

alter table, 
analyze table,
check table

开启

 set global log_slow_admin_statements = "ON";

直接修改配置文件-全局需要重启mysql服务谨慎执行

#编辑配置文件
vim /etc/my.cnf

# 修改配置项(如果没有就加上)
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/my-slow.log
long_query_time = 1
log_timestamps = SYSTEM
log_output = FILE

# 重启mysqld服务
systemctl restart mysqld

# 查看mysqld服务
systemctl status mysqld

慢查询日志分析-mysqldumpslow

-mysql自带的慢查询分析工具,专业的分析工具还有Navicat Monitor,hertzbeat,pt-query-digest等分析工具

Percona Toolkit是一套用于MySQL性能分析和优化的工具集合。其中包括 pt-query-digest工具,它可以分析MySQL慢查询日志并生成详细的报告-以后单独出文章编写
pt-query-digest /path/to/slow.log
[root@DB-Server ~]# mysqldumpslow --help
 Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
 
Parse and summarize the MySQL slow query log. Options are
 
  --verbose    verbose
  --debug      debug
  --help       write this text to standard output
 
  -v           verbose
  -d           debug
  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default(排序方式)
                 al: average lock time(平均锁定时间)
                 ar: average rows sent(平均返回记录数)
                 at: average query time(平均查询时间)
                  c: count(访问计数)
                  l: lock time(锁定时间)
                  r: rows sent(返回记录)
                  t: query time(查询时间)
   -r           reverse the sort order (largest last instead of first)
   -t NUM       just show the top n queries(返回前面n条数据)
   -a           don't abstract all numbers to N and strings to 'S'
   -n NUM       abstract numbers with at least n digits within names
   -g PATTERN   grep: only consider stmts that include this string(正则匹配模式,大小写不敏感)
   -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),
                default is '*', i.e. match all
   -i NAME      name of server instance (if using mysql.server startup script)
   -l           don't subtract lock time from total time

得到返回记录集最多的10个SQL

mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到访问次数最多的10个SQL:

mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照时间排序的前10条里面含有左连接的查询语句:

mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

取出查询时间最慢的10条慢查询

mysqldumpslow -s t -t 10  /database/mysql/mysql06_slow.log

你可能感兴趣的:(【MySQL】,mysql,sql)