从一种 db 转到另一种 db 的最初阶段,往往要找自己原来熟悉的工具。拿我自己来说,算是有点 oracle 的经验,有时被问及 mysql 优化的东西,就希望找到 mysql 上类似 oracle 等待接口或是 sql trace 之类的工具,多少有些路径依赖。 slow query log 是 mysql
从一种 db 转到另一种 db 的最初阶段,往往要找自己原来熟悉的工具。拿我自己来说,算是有点 oracle 的经验,有时被问及 mysql 优化的东西,就希望找到 mysql 上类似 oracle 等待接口或是 sql trace 之类的工具,多少有些路径依赖。
slow query log 是 mysql 的基本 log 之一。这个优化思路基本上是用 sql 执行时间 作基准(类似 oracle 基于等待的优化思想。另外,在 mysql 中我还没发现根据 逻辑 io 作基准的方法,这样对于存储层的性能控制就有些不好入手)具体如何操作我就不赘述了。默认情况下,在产品环境中如果临时决定起用该特性是影响可用性的。另外,旧一些的版本时间粒度相对比较大(最小 1 秒钟)。可以通过 microslow patch 来解决这个问题(粒度可以到百万分之一秒)。这个 patch 在开发测试环境也很有用武之地,有些公司的线下开发环境数据不能达到产品环境的规模,如果也把眼光放到抓取执行时间大于 1 秒钟的 sql 无疑会漏掉很多潜在的问题语句。
在 mysql 5.0 之后,利用 --log-queries-not-using-indexes 参数可以抓到未使用索引的慢查询。为什么 sql 没有使用索引,这恐怕是开发 db 应用的朋友要问的最常见的问题之一。
关于 slow query log 的分析,mysql 自带有 mysqldumpslow 分析工具,除此之外,也有包装的更好(?)一点的开源工具,比如 myprofi,以及 mysql-log-filter。
sun 收购 mysql 之后,相信很多人都会对 dtrace 能否集成到 mysql 比较感兴趣。其实原来就有人利用 dtrace 来分析 mysql 性能问题。不过这个方式门槛还比较高,也没有形成比较清晰的方法论。
网上关于 mysql 优化的文章汗牛充栋,我这篇就当是读书笔记吧。
--eof--