分析查询日志
强烈建议大家从现在起就利用慢查询日志捕获服务器上的所有查询并且进行分析可以在一些典型的时间窗口如业务高峰期的一个小时内记录查询如果业务趋势比较均衡那么一分钟甚至更短的时间内捕获需要优化的低效查询也是可行的
不要直接打开整个慢查询日志进行分析这样做只会浪费时间和金钱首先应该生成一个剖析报告如果需要则可以再查看日志中需要特别关注的部分自顶向下是比较好的方式否则有可能像前面提到的反而导致业务的逆优化
从慢查询日志中生成剖析报告需要有一款好工具这里我们建议使用ptquerydigest这毫无疑问是分析MySQL 查询日志最有力的工具该工具功能强大包括可以将查询报告保存到数据库中以及追蹤工作负载随时间的变化
一般情况下只需要将慢查询日志文件作为参数传递给ptquerydigest就可以正确地工作了它会将查询的剖析报告打印出来并且能够选择将重要的查询逐条打印出更详细的信息输出的报告细节详尽绝对可以让生活更美好该工具还在持续的开发中因此要了解最新的功能请阅读最新版本的文档
这里给出一份ptquerydigest输出的报告的例子作为进行性能剖析的开始这是前面提到过的一个味修改过的剖析报告
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ================ ===== ====== ===== =======
# xBFCFEFF % SELECT InvitesNew?
# xBCABBCEC % SELECT StatusUpdate?
# xBCCCC % SHOW STATUS
# xCBDBBBCF % SHOW STATUS
# MISC xMISC % < ITEMS>
可以看到这个比之前的版本多了一些细节首先每个查询都有一个ID这是对查询语句计算出的哈希值指纹计算时去掉了查询条件中的文本值和所有空格并且全部转化为小写字母(请注意第三条和第四条语句的摘要看起来一样但哈希指纹是不一样的)该工具对表名也有类似的规范做法表名InvitesNew 后面的问号意味着这是一个分片(shard)的表表名后面的分片标识被问号替代这样就可以将同一组分片表作为一个整体做汇总统计这个例子实际上是来自一个压力很大的分片过的Facebook 应用
报告中的V/M 列提供了方差均值比(variancetomean ratio)的详细数据方差均值比也就是常说的离差指数(index of dispersion)离差指数高的查询对应的执行时间的变化较大而这类查询通常都值得去优化如果ptquerydigest 指定了explain 选项输出结果中会增加一列简要描述查询的执行计划执行计划是查询背后的极客代码通过联合观察执行计划列和V/M 列可以更容易识别出性能低下需要优化的查询
最后在尾部也增加了一行输出显示了其他 个占比较低而不值得单独显示的查询的统计数据可以通过limit 和outliers 选项指定工具显示更多查询的详细信息而不是将一些不重要的查询汇总在最后一行默认只会打印时间消耗前 位的查询或者执行时间超过 秒阈值很多倍的查询这两个限制都是可配置的
返回目录高性能MySQL
编辑推荐
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程
Oracle索引技术
[] []