Mysql效率优化定位较低sql的两种方式
关于mysql效率优化一般通过以下两种方式定位执行效率较低的sql语句。
通过慢查询日志定位那些执行效率较低的SQL语句,用--log-slow-queries[=file_name]选项启动时,mysqld会写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL。
慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用showprocesslist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看SQL的执行情况,同时对一些锁表操作进行优化。
下面我们举例说明一下,如何通过慢查询日志定位执行效率底的SQL语句:
开启慢查询日志,配置样例:
log-slow-queries
在my.cnf配置文件中增加上述配置项并重启mysql服务,这时mysql慢查询功能生效。慢查询日志将写入参数DATADIR(数据目录)指定的路径下,默认文件名是host_name-slow.log。
和错误日志、查询日志一样,慢查询日志记录的格式也是纯文本,可以被直接读取。下例中演示了慢查询日志的设置和读取过程。
(1)首先查询一下long_query_time的值。
mysql>showvariableslike'long%'; +-----------------+-------+ |Variable_name|Value| +-----------------+-------+ |long_query_time|10| +-----------------+-------+ 1rowinset(0.00sec)
(2)为了方便测试,将修改慢查询时间为5秒。
mysql>setlong_query_time=5;
QueryOK,0rowsaffected(0.02sec)
(3)依次执行下面两个查询语句。
第一个查询因为查询时间低于5秒而不会出现在慢查询日志中:
mysql>selectcount(*)fromorder2008; +----------+ |count(*)| +----------+ |208| +----------+ 1rowinset(0.00sec)
第二个查询因为查询时间大于5秒而应该出现在慢查询日志中:
mysql>selectcount(*)fromt_user; +----------+ |count(*)| +----------+ |6552961| +----------+ 1rowinset(11.07sec)
(4)查看慢查询日志。
[root@localhostmysql]#morelocalhost-slow.log #Time:08102619:46:34 #User@Host:root[root]@localhost[] #Query_time:11Lock_time:0Rows_sent:1Rows_examined:6552961 selectcount(*)fromt_user;
从上面日志中,可以发现查询时间超过5秒的SQL,而小于5秒的则没有出现在此日志中。
如果慢查询日志中记录内容很多,可以使用mysqldumpslow工具(MySQL客户端安装自带)来对慢查询日志进行分类汇总。下例中对日志文件mysql_master-slow.log进行了分类汇总,只显示汇总后摘要结果:
[root@mysql_mastermysql_data]#mysqldumpslowmysql_master-slow.log Readingmysqlslowquerylogfrommysql_master-slow.log Count:2Time=11.00s(22s)Lock=0.00s(0s)Rows=1.0(2),root[root]@mysql_master selectcount(N)fromt_user;
对于SQL文本完全一致,只是变量不同的语句,mysqldumpslow将会自动视为同一个语句进行统计,变量值用N来代替。这个统计结果将大大增加用户阅读慢查询日志的效率,并迅速定位系统的SQL瓶颈。
注意:慢查询日志对于我们发现应用中有性能问题的SQL很有帮助,建议正常情况下,打开此日志并经常查看分析。
以上是给大家介绍的Mysql效率优化定位较低sql的两种方式,希望以上所述对大家有所帮助。