【问题标题】:PHP - Is it good practice to cache MYSQL queries in a txt file?PHP - 在 txt 文件中缓存 MYSQL 查询是一种好习惯吗?
【发布时间】:2011-06-22 00:34:10
【问题描述】:

我正在建立一个在线商店并尝试通过最小化 MYSQL 查询来提高性能。

通过 txt 文件缓存 mysql 查询然后获取它而不是查询是一种好习惯吗?这就是我正在做的”

  1. 一个php类将sql查询当作一个字符串
  2. 对它进行 md5 处理
  3. 如果这是第一次运行
  4. 然后对数据库执行查询
  5. 在数组中获取结果
  6. 序列化数组并将其存储为 md5_Of_Query.txt
  7. 根据缓存是否存在且有效,返回实际查询的 unserialize(file_get_contents(md5_of_Query.txt)) 或 $results。
  8. 该类还检查 txt 文件的 filemtime(),如果大于一小时,则重新执行查询并刷新缓存。

这比每次都做sql查询效率高吗?我遗漏了什么安全问题?

【问题讨论】:

    标签: php mysql caching outputcache


    【解决方案1】:

    如果您进行基准测试,创建唯一哈希和执行 IO 到磁盘的成本将比简单地从 MySQL 服务器获取更大。

    恕我直言,不要费心去这个程度。好主意,但 MySQL 已经进行了内部缓存和性能调整。

    专注于构建您的应用程序,因为“过早的优化是万恶之源”。

    【讨论】:

    • 谢谢。您的建议为我省去了很多尝试和错误。
    【解决方案2】:

    如果您刚刚启动应用程序,memcache 是一种比使用文本文件更快的方法。

    http://memcached.org/

    文本文件将完成这项工作,并且您概述的步骤很有意义,但 memcache 会更快并为您处理大量繁重的工作。

    【讨论】:

    • 非常感谢,在我的 WAMP 服务器上安装了 memcache,现在将使用此缓存进行构建。
    • 在单个 WAMP 上它无法产生影响,Windows 上的文本文件访问已经缓存在内存中。 Memcached 增加了开销并窃取内存 Web 服务器和数据库将有更多用途。 Memcached 适用于 much much 更大的场景。使用大型服务器群和缓存服务器来回答查询和子查询。在这种情况下,memcached(通过 网络套接字 上的非常文本协议 查询内存)可以从丰富的资源冗余中获得最佳性能。单机无法从中获益。
    • 很好,但是在应用程序的开发生命周期开始时计划扩展是一个好主意。我不相信应用程序将托管在 WAMP 服务器上,我认为这仅用于开发和测试。
    • & @ZJR - 是的,该应用程序不会托管在 WAMP 服务器上:)。它将在具有 512 - 1GB 内存的 VPS 上。
    【解决方案3】:

    您的方法看起来有点像将问题从一个角落转移到另一个角落。

    引入缓存并没有提高 Mysql 的性能。更好地查看哪些查询实际上很慢,然后优化查询。

    http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

    【讨论】:

      【解决方案4】:

      如果您希望实现缓存并着眼于未来的可扩展性,我建议您设置 RESTful 服务以在数据库上运行查询,然后使用 Web 服务器的 HTTP 缓存功能来缓存结果。步骤如下:

      1. 原始页面需要运行查询
      2. 它向服务 URL 生成一个 http GET 请求,将参数作为 URL 中的查询参数传递
      3. 位于 URL 的 php 脚本接受查询参数,验证它们,并将它们添加到 MySql 查询中
      4. 脚本在数据库上运行查询
      5. 脚本序列化结果并将其设置为输出
      6. Web 服务器缓存请求的响应,并为以后使用相同 URL 的请求返回它
      7. 原始页面使用来自服务的序列化结果生成 HTML

      您可以阅读有关使用 Apache 缓存 PHP 的更多信息here。您现在所做的工作与此接近,但您的应用程序将能够通过基于服务的方法更好地扩展。

      【讨论】:

        【解决方案5】:

        只是想权衡一下我的两分钱,serialworm 和 phpdeveloper 所说的共享内存/ram 比您提出的任何磁盘 IO 绑定操作快得多的事实。 尽可能多地向 mysql 投掷 ram,除非您确实需要升级到集群,否则您不需要处理缓存管理,而这需要其他考虑因素。 Memcache 让您可以更好地控制缓存管理,因此您需要进行更多编码。

        我会先构建应用程序,然后对其进行压力测试并优化查询,和/或根据需要添加缓存管理。

        【讨论】:

          【解决方案6】:

          看两件事,benchmarkingprofiling。关于你可以有意义地比较 atything 的唯一方法是一起使用这些学科的 2 个指标,使用你当前使用的 mysql 配置、php.ini、httpd.conf、.htaccess、mod rewrite 东西和许多其他东西将是基准测试和分析执行任务的代理技术。

          【讨论】:

            【解决方案7】:

            这很荒谬,你应该缓存结果

            查询组装时间应该可以忽略不计。 (如果不是,您没有按照应有的方式使用 SQL,而是生成了愚蠢的selects 的,而聪明的join 会已经解决了)

            从磁盘加载查询显然容易减慢速度。
            (不过,操作系统可能正在缓存磁盘 IO,因此很难发现)

            无论如何,真正需要时间的是从数据库中获取结果,然后通过模板将它们重新设置为网页的样式。在您的位置,我会将给定查询的 样式化结果 缓存到磁盘,当被问及缓存不是太旧时,我会直接readfile() 他们。

            【讨论】:

              【解决方案8】:

              你配置MySQL的query cache了吗?

              【讨论】:

                猜你喜欢
                • 2010-12-24
                • 2018-01-17
                • 1970-01-01
                • 1970-01-01
                • 2020-09-10
                • 2023-04-05
                • 1970-01-01
                • 2011-10-31
                • 1970-01-01
                相关资源
                最近更新 更多