【问题标题】:PHP Best way to cache MySQL results?PHP 缓存 MySQL 结果的最佳方法?
【发布时间】:2011-03-16 15:00:30
【问题描述】:

我目前正在构建一个 PHP 框架(我知道是原创的)并且我正在为它开发一些优化功能。我遇到的一个难题是缓存 MySQL 结果的最佳方法是什么?我知道有些人会说,首先优化你的 MySQL 等,但是为了争论,我的查询需要 1 分钟才能运行并且尽可能优化。

在 PHP 中缓存结果的最佳方式是什么,这样我就不必在每次页面加载时都重新运行查询?

我的第一个想法是循环遍历结果,将它们添加到数组中...序列化它们,然后存储在文件中。现在由于创建缓存只发生一次,如果数组包含 100 万个结果,我可以承担序列化函数的开销。然而,加载缓存文件,然后在每次页面加载时反序列化数组,可能会对性能产生影响。

那么在缓存时是否会更好,而不是序列化结果和写入文件,而是以一种在 PHP 可读数组中显示结果的方式写入文件。所以当它加载时,没有反序列化开销。

是否有任何其他(阅读:更快)方法来缓存慢查询以供频繁使用?

【问题讨论】:

    标签: php mysql performance caching


    【解决方案1】:

    Memcached.

    我总是尝试至少创建一次自己的解决方案,以便更好地掌握大多数情况下发生的事情。当我创建自己的缓存解决方案时,我基本上做了你所说的。

    // serialize an array of all results
    $serialzedData = serialize($resultData);
    
    // set TTL (60 seconds) and create cache filename with timestamp
    $ttl = 60;
    $cacheFilename = $ttl . '_' . time() . '_' . md5($sqlQuery)
    
    // dump
    file_put_contents($cacheFilename, $serializedData);
    

    在查询触发之前,它会在cache 目录中搜索具有匹配查询哈希的文件。如果是,则测试timestamp + ttl <= current_time,如果为真,则返回未序列化的文件内容。否则,覆盖它。

    【讨论】:

    • 我昨天做了几乎同样的事情,以减少少数特定查询所产生的影响,但实际上并没有太大帮助。我假设序列化、处理文件(无论是读取、写入还是其他)、反序列化等所带来的开销最终变得足够慢,以至于不值得这样做。
    • 在表更新/插入频繁的情况下,上述解决方案可能不起作用。在需要实时数据超过 60 秒的实时/关键应用程序中是不够的,并且返回旧数据而不是更新数据会有所变化。您可以使用 MySQL UDF 并在插入/更新/删除触发器上调用 php 脚本来使缓存文件无效。这样,您将确保没有旧的缓存文件驻留在您的目录中,并且您可能不需要使用 60 秒的时间。 UDF 和触发器可以是一种方法......
    • 绝对@SURFER-TM,天真的例子只是为了帮助掌握缓存工作流程。今天,我结合使用临时记忆(如果适用)和 Redis 来获得更长的 TTL 后备存储。
    • 试试 MySQL UDF 和触发器。你一定会喜欢的……
    【解决方案2】:

    如果这是一个直接数组,那么您可以使用 var_export() 而不是序列化(用适当的 "" 包装它并将其写入 .php 文件;然后在您的脚本中使用 include() 。如果您这样做最好可以将其写在 htdocs 树之外,并且仅适用于内存缓存认为过多的大量数据。

    【讨论】:

    • 这是个好主意,相比之下我的就相形见绌了。我想我会在我现有的自制解决方案中实现类似的东西。
    • 如果您想避免序列化,这可能是在框架内执行此操作的最佳方法。虽然我怀疑序列化会有很多开销。序列化将显着减少您的缓存文件大小。
    【解决方案3】:

    Google for Memcache,这应该会让您朝着正确的方向前进。

    【讨论】:

    • 我理解 memcache 是一个需要预先安装在服务器上的编译库是否正确?如果是这样,我不能指望使用该框架的每个人都安装它:/
    • 还有 APC 可能更容易使用,因为它是一个 PHP 模块,不需要外部应用程序。虽然我确信性能没有那么好。
    • 或redis,但人们访问redis的可能性低于memcache或APC
    • @adam-peck APC 通常比 memcache 快,因为它不需要从(外部)服务器发出请求,因此没有网络延迟
    • Memcache 和 APC 没有可比性。实现两个不同的目标。
    【解决方案4】:

    Mysql 缓存查询结果,可能你应该增加 mysql 查询缓存大小?还是在独立表中缓存大查询的结果?

    【讨论】:

      猜你喜欢
      • 2013-03-22
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2012-12-11
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多