优化MySQL最重要的一部分工作是先确定”有问题”的查询语句。只有先找出这些查询较慢的sql查询(执行时间较长),我们才能进一步分析原因并且优化它。MySQL为我们提供了Slow Query Log记录功能,它能记录执行时间超过了特定时长的查询。分析Slow Query Log有助于帮我们找到”问题”查询。记录slow queries首先,我们需要查看mysql server版本号,以及是否配置启用了slow query log。#打开服务log_slow_queries = ON当log_slow_queries是ON时,才表示已经启用了记录slow query功能。默认是不记录slow query的。启用slow query日志#//将下列配置放到my.cnf中[mysqld]log-slow-queries = /var/lib/mysql/slow-queries.log//新增加的参数long_query_time = 3log-queries-not-using-indexeslog-slow-admin-statements上面的配置打开了slow query日志,将会捕获了执行时间超过了3秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql/slow-queries.log文件中。log-slow-queries <slow_query_log_file>存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。long_query_time如果query time超过了该值,则认为是较慢查询,并被记录下来。单位是秒,最小值是1,默认值是10秒。10秒对于大多数应用来讲,太长了。我们推荐从3秒开始, 依次减少,每次都找出最”昂贵”的10条SQL语句并且优化他们。日复一日,一步一步优化。一次性找出很多条SQL语句,对于优化来讲,意义并不大。log-queries-not-using-indexesMySQL会将没有使用索引的查询记录到slow query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致服务器变慢,甚至还会使用大量的磁盘空间。log-slow-admin-statements一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。日志文件
pt-query-digest 子曰:“工欲善其事,必先利其器”善于利用好的性能分析工具可以使运维效率事半功倍。pt-query-digest 属于 Percona Toolkit 工具集中较为常用的工具,用于分析 slow log,可以分析 MySQL 数据库的 binary log 、 general log 日志,同时也可以使用 show processlist 或从 tcpdump 抓取的 MySQL 协议数据来进行分析。