我正在调试一个MySQL服务器中查询速度慢的问题。查询通常在100-400毫秒内完成,但有时会飙升到10秒或100秒。
查询是由我无法控制的应用程序生成的,并且有多个数据库(每个客户一个)。慢查询似乎是随机出现的,当记录慢查询时,RAM、磁盘或CPU都没有加载。当我手动运行查询时,它们运行得很好(就像在millisecs中一样),这让我怀疑与其他读写查询一起出现的锁定问题。查询本身很可怕(无法在WHERE或ORDER BY子句中使用索引),但是最大的表相对较小(最多200.000行),并且几乎没有连接。当我分析查询时,大部分时间都花在对结果进行排序上(在查询运行正常的情况下)。
我无法在测试环境中重现这种极慢的速度,我现在最好的想法是停止生产MySQL服务器,创建数据库的副本,启用完整的查询日志记录,然后重新启动服务器。通过这种方式,我应该能够重播加载并重现问题。但是一般的查询日志似乎只记录查询,而不是查询的目标数据库。我是否有用于MySQL的其他录制/重放选项?
发布于 2012-09-07 20:22:48
我终于解决了这个问题。这个应用程序正在做类似这样的事情:
cursor = conn.execute("SELECT * FROM `LargeTable`")
while cursor.has_more_rows():
cursor.fetchrow()
do_something_that_takes_a_while()
cursor.close()它正在获取和处理结果集,一次一行。如果循环需要100秒才能完成,则表在服务器上锁定100秒。
在MySQL服务器上更改此设置:
set global SQL_BUFFER_RESULT=ON;使缓慢的查询立即消失,因为现在将结果集推送到临时表,以便可以删除表锁,而不管应用程序使用结果集的速度有多慢。该设置会带来许多其他性能问题,但幸运的是,服务器的大小可以处理这些问题。
发布于 2012-09-05 06:14:13
您可以使用慢查询日志:http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html
只需将阈值设置为一个非常小的值(希望您运行的是mysql > 5.1 )
否则,您可以使用tcpdump:http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/
当然,如果您使用它,您可能需要查看percona工具包的pt-query-digest来处理tcpdump输出:http://www.percona.com/doc/percona-toolkit/2.1/pt-query-digest.html
为了便于将来参考,您可能需要设置查询和服务器监视:https://github.com/box/Anemometer/wiki和https://github.com/box/RainGauge/wiki/What-is-Rain-Gauge%3F
发布于 2013-05-01 09:18:08
Percona正在开发一个名为Playback的新工具,它可以做你想做的事情:http://www.mysqlperformanceblog.com/2013/04/09/percona-playback-0-6-for-mysql-now-available/
https://stackoverflow.com/questions/12271984
复制相似问题