【发布时间】:2011-03-01 21:49:02
【问题描述】:
我有一个超过 150,000 行的表,其中大部分会每天更新。我打开了 mysql 缓存,因此页面加载速度更快,但是每次更新数据库时页面加载速度再次变慢,我认为这是缓存本身再次构建。
因此,目前我已在服务器上执行wget -m --delete-after http://localhost/,但这需要大约 4 小时才能完成并移动了 13 gig 之类的东西。
有没有更好的方法来做到这一点?
【问题讨论】:
我有一个超过 150,000 行的表,其中大部分会每天更新。我打开了 mysql 缓存,因此页面加载速度更快,但是每次更新数据库时页面加载速度再次变慢,我认为这是缓存本身再次构建。
因此,目前我已在服务器上执行wget -m --delete-after http://localhost/,但这需要大约 4 小时才能完成并移动了 13 gig 之类的东西。
有没有更好的方法来做到这一点?
【问题讨论】:
根据您使用的是 MyISAM 存储引擎还是 InnoDB 存储引擎,MySQL 缓存的工作方式有所不同。
MyISAM 只缓存索引,不缓存数据。您可以使用LOAD INDEX INTO CACHE 将 MyISAM 索引预加载到键缓冲区缓存中。但是如果你使用 InnoDB,则没有等效的语句。
InnoDB 缓存数据和索引页面。没有专门的命令来预热缓存缓冲区,但是您可以执行一些 SQL 语句来执行全表扫描和全索引扫描以将它们加载到缓冲区中。您应该能够使用服务器上的脚本来执行此操作,而无需求助于wget!
我同意@code_burgar 的回答:150k 行足够小,以至于在缓存预热时您不会注意到太多的性能损失。
如果您说的是对Query Cache 进行热身,那就是另一个问题了。您必须使用特定的 SQL 查询来预热查询缓存,因为该缓存保持与这些 SQL 查询逐字关联的结果集。您的wget 解决方案效率低下,可能会重复很多工作。您应该能够通过在服务器上运行一个脚本来启动查询缓存,该脚本执行您想要缓存的每个查询一次。
但您可能需要进行代码审查以确定这些查询是什么,并在您的代码更改时定期更新您的缓存预加载脚本。
【讨论】:
就表大小而言,150,000 行确实很小。
您的表是否正确编入索引?
你是如何进行更新的,你是在安排和/或限制更新,还是一次就放手?
减速很可能发生,因为您试图一次更新太多行而没有让服务器喘口气。尝试限制更新。
【讨论】: