【问题标题】:How to manually build mysql cache如何手动构建mysql缓存
【发布时间】:2011-03-01 21:49:02
【问题描述】:

我有一个超过 150,000 行的表,其中大部分会每天更新。我打开了 mysql 缓存,因此页面加载速度更快,但是每次更新数据库时页面加载速度再次变慢,我认为这是缓存本身再次构建。

因此,目前我已在服务器上执行wget -m --delete-after http://localhost/,但这需要大约 4 小时才能完成并移动了 13 gig 之类的东西。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: mysql caching wget


    【解决方案1】:

    根据您使用的是 MyISAM 存储引擎还是 InnoDB 存储引擎,MySQL 缓存的工作方式有所不同。

    MyISAM 只缓存索引,不缓存数据。您可以使用LOAD INDEX INTO CACHE 将 MyISAM 索引预加载到键缓冲区缓存中。但是如果你使用 InnoDB,则没有等效的语句。

    InnoDB 缓存数据和索引页面。没有专门的命令来预热缓存缓冲区,但是您可以执行一些 SQL 语句来执行全表扫描和全索引扫描以将它们加载到缓冲区中。您应该能够使用服务器上的脚本来执行此操作,而无需求助于wget

    我同意@code_burgar 的回答:150k 行足够小,以至于在缓存预热时您不会注意到太多的性能损失。

    如果您说的是对Query Cache 进行热身,那就是另一个问题了。您必须使用特定的 SQL 查询来预热查询缓存,因为该缓存保持与这些 SQL 查询逐字关联的结果集。您的wget 解决方案效率低下,可能会重复很多工作。您应该能够通过在服务器上运行一个脚本来启动查询缓存,该脚本执行您想要缓存的每个查询一次

    但您可能需要进行代码审查以确定这些查询是什么,并在您的代码更改时定期更新您的缓存预加载脚本。

    【讨论】:

    • 非常感谢它是 MyISAM,所以我会在早上尝试 LOAD INDEX INTO CACHE 命令,看看它是否有效。对于查询缓存,它会像从每个表中选择所有一样简单吗?
    • 查询缓存缓存特定查询的结果集。因此,从每个表中选择所有都无济于事(除非这些是您在应用程序中使用的查询,我对此表示怀疑)。
    • 做到了,现在这么快 :) 谢谢!
    【解决方案2】:

    就表大小而言,150,000 行确实很小。

    您的表是否正确编入索引?

    你是如何进行更新的,你是在安排和/或限制更新,还是一次就放手?

    减速很可能发生,因为您试图一次更新太多行而没有让服务器喘口气。尝试限制更新。

    【讨论】:

    • 我相信它已正确编入索引,我没有创建数据库,但我认为创建数据库的人对此非常了解。更新在一个非实时数据库中一次完成,需要 1.5 小时(爬虫)。然后将表复制到实时数据库上,大约需要 3 秒。之后网站上的页面加载缓慢。
    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2020-08-11
    • 2017-02-03
    • 2014-11-08
    相关资源
    最近更新 更多