【问题标题】:MySQL cache, do not flush on update until 10 minutes oldMySQL 缓存,直到 10 分钟才刷新更新
【发布时间】:2023-03-24 20:15:01
【问题描述】:

是否有可能使 MySQL 在表更新时不刷新缓存,并在刷新缓存之前至少保持 10 分钟?

基本上,我正在缓存一个分析大约 200k+ 条记录并返回 10 行数据的查询。查询大约需要 1.5 - 3 秒。我正在使用 SQL_CACHE 来缓存该查询,在第一次之后需要 0.007(+-) 秒。表更新非常频繁(不到一分钟内多次)。所以我想让 MySQL 在刷新缓存查询以重新计算之前至少保留缓存 10 分钟。

顺便说一下,查询数据对于网站上的每个用户都是唯一的。

我正在使用 Codeigniter 框架,我知道它们具有内置的查询缓存功能,但它是基于文件系统的。这就是为什么我更喜欢 MySQL 的缓存功能...

感谢大家的帮助!

【问题讨论】:

    标签: php mysql caching


    【解决方案1】:

    三件事会导致从 MySQL 缓存中删除:

    1. 空间不足
    2. 查询背后的数据发生了变化
    3. MySQL 进程重新启动

    您对#1 有相当大的控制权,因为您可以更改缓存大小。但是,其他查询仍然会占用缓存空间。我不知道控制 #2 有多重要。您可能想使用SELECT SQL_NO_CACHE 来防止那些进入缓存。

    从事物的声音来看,MySQL 并没有为您提供所需的东西来以您想要的方式缓存事物。

    您是否考虑过优化查询?在那张纸条上,你能发布实际的查询吗?

    【讨论】:

    • 我不想阻止数据进入缓存。我只是想防止缓存在表更新后立即被刷新。该表基本上保存了流量数据,因此经常添加/更新记录。我只需要 MySQL 在缓存数据失效之前将其保存至少 10 分钟左右。我的查询是这样的:SELECT SQL_CACHE dday, COUNT(*) AS num, SUM(hits) AS sum_hits FROM table1 WHERE user_id = '1' AND dmonth = '11' AND dyear = '2012' GROUP BY dday
    • 这实际上是一个非常简单的查询。您是否尝试将 user_id 添加到表索引?
    • 所有必需的索引都已添加。我认为最好的替代方法是编写一个新的数据库缓存驱动程序来使用 memcached 处理缓存的数据..
    • "所有必需的索引都已添加。"您的意思是您已尝试将 user_id 添加到索引中,但没有帮助?或者你的意思是你没有因为 MySQL 没有明确要求它?
    • 它已经被添加了,并且有很大的不同。我可以很容易地通过硬件查询来提高性能,现在硬件只有一个核心和 2gb ram(测试服务器)。我只是想要一种方法来缓存它,因为以后一旦投入生产,记录就会增长到数百万。
    猜你喜欢
    • 2016-02-13
    • 2018-05-16
    • 2017-04-11
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多