慢查询分析
慢查,顾名思义就是很慢的查询。SQL的执行总是有一个执行时间的,通过long_query_time参数告诉MySQL,当SQL的执行时间超过该参数的指定值后就将这条SQL记录在慢查日志中。
默认的long_query_time默认值为10s
在MySQL5.1之前确实慢查日志确实是以文件的形式存在。但是MySQL5.1之后MySQL允许我们可以将慢查日志放入一个数据表中,便于我们查看分析。
现在公司使用的一般都是5.6~5.7版本。当然即使5.1版本之后支持了将数据放入Table中,默认配置依然是File。
当然你也可以通过下面的命令将慢查输出类型改成Table
慢查有什么危害?#
研发同学都知道:对于Linux操作系统来说,一个进程能打开的Socket文件句柄是上限的。即使我们可以动态的调整它的大小,但是也做不到无限大。
通过命令: 查看进程被限制的使用各种资源的量
ulimit -a
core file size: 进程崩溃是转储文件大小限制
man loaded memort 最大锁定内存大小
open file 能打开的文件句柄数
大量的慢查占据MySQL连接(Linux操作系统会为每一条连接创建socket文件),慢查累积到一定程度还会导致正常的SQL得不到连接执行从而变成慢查SQL,最终有可能导致MySQL的连接全部被耗光而夯死。这就是生产级别的事故了。
如何优化?
1.show PROCESSLIST; //查看正在执行的sql语句
2.explain //查看sql语句优化空间
explain(执行计划)包含的信息十分的丰富,着重关注以下几个字段信息。
①id,select子句或表执行顺序,id相同,从上到下执行,id不同,id值越大,执行优先级越高。
②type,type主要取值及其表示sql的好坏程度(由好到差排序):system>const>eq_ref>ref>range>index>ALL。保证range,最好到ref。
③key,实际被使用的索引列。
④ref,关联的字段,常量等值查询,显示为const,如果为连接查询,显示关联的字段。
⑤Extra,额外信息,使用优先级Using index>Using filesort(九死一生)>Using temporary(十死无生)。
着重关注上述五个字段信息,对日常生产过程中调优十分有用。
3.mysqldumpslow
MySQL也为用户提供了一些原生的慢查工具。比如:查看执行时间最长的10条SQL
mysqldumpslow -s a1 -n 10 mysql.slow_log