我有一个5GB的数据库,所有的表都是MyISAM。它从上午01:30到上午8:30(100多个选择,150多个更新,每秒200多次缓存命中)进入重载时间进行数据分析,在其他时间,负载适中(10次选择,每秒5次插入) )。
问题是在几天之后,重载时间期间的数据分析似乎变慢,可能是由于查询缓存修剪(iowait增加)。当前查询缓存设置为1.5G,而总RAM为4G。手动重启mysql服务器后再次运行速度很快。
有没有办法在mysql服务器上进行常规优化或清理,以保证它在没有重启的情况下高效运行
答案 0 :(得分:0)
听起来我的应用程序正在忙于更新表,您可能会遇到表争用。你有mytop运行,或者SHOW PROCESSLIST能否让你了解你的应用程序哪些部分做得最多?您是否启用了--slow-query-log设置?
此外,您的数据库表引擎可能是一个问题。您使用的是MyISAM还是InnoDB?您希望在更新期间注意表锁定,以及可以创建多少备份。
如果你发出FLUSH QUERY CACHE,这可能导致不良,那么许多版本的MySQL在运行该命令时会出现近乎锁定。
此外,运行top并检查可能影响系统负载的cronjobs的/ var / log / cron可能有所帮助。如果您在服务器上运行updatedb或logrotate,则可能会影响iowait。
答案 1 :(得分:0)
您的查询缓存大小似乎太大了。虽然查询缓存通常是一件好事,但如果它太大,它可能会伤害更多,然后它会有所帮助。
this article中讨论了这种行为:
这里的问题是客户具有中等级别的写入流量,并且当更新该表时,当前查询缓存实现使给定表的所有结果集无效。随着查询缓存的大小增加,对于给定表必须无效的条目数也可能增长。此外,高速缓存上的粗锁定可能导致锁定争用,这可能会降低性能,尤其是在多核硬件上。
我建议将查询缓存的大小降低到16-128MB之间,看看效果如何。
另一种可能性是查询生成的结果集非常小,导致内存碎片。有关此问题的更多信息是available here,请查找“query_cache_min_res_unit”设置。