【问题标题】:Storing frequently accessed data in a file rather than MySQL将经常访问的数据存储在文件中而不是 MySQL
【发布时间】:2011-01-15 12:36:57
【问题描述】:

我正在开发一个 PHP 内容管理系统,在测试中,我注意到系统的很多 MySQL 表几乎在每个页面上都会被查询,但很少被写入。我想知道的是,随着网站流量的增加,这是否会开始严重影响数据库,我该如何解决/防止这种情况?

我最初的想法是开始在文件中存储一些更静态的数据(使用 PHP 序列化),但这是否真的减少了服务器负载?我担心的是我只是将高负载从数据库转移到文件系统!

如果有人能告诉我更好的方法,那就太好了。如果数据量本身有很大的影响,我在下面详细说明了我将存储的一些数据:

  • 国家/地区的完整列表(包括 ISO 国家/地区代码)
  • 网站选项(皮肤、管理员电子邮件、支持 URL 等)
  • 用户组(包括权限)

【问题讨论】:

    标签: php database optimization caching filesystems


    【解决方案1】:

    您必须记住,从功能强大的服务器和快速连接上的数据库读取表可能比从本地计算机上的磁盘读取表要快。数据库会将这些定期访问的小表全部缓存在内存中。

    通过自己在文件系统中实现相同的功能,只有很小的可能加速,但很有可能会搞砸并使其变慢。

    最好还是坚持使用数据库。

    【讨论】:

    • 酷,谢谢。我认为我应该继续使用 MySQL 是相当一致的!
    【解决方案2】:
    1. 优化你的查询(使用mysql慢查询日志)和EXPLAIN函数。

    2. 如果表很少写入,您可以使用本机 MySQL 缓存。您的代码无需更改,只需在 my.conf 中启用 mysql 缓存即可。

    3. 尝试使用 Smarty (smarty.net) 等模板引擎。它有自己的缓存系统,运行良好,可以真正减少服务器负载。

    4. 您也可以使用 Memcache,但它确实值得仅用于负载非常高的网站。 (我认为 Smarty 就足够了。)

    【讨论】:

    • 一定要检查mysql缓存,如果经常做同样的查询,可以直接保存在ram中,比任何文件系统都好。总是让专业人士来做这种事情。
    • 最好使用模板引擎,它只是将模板编译为纯 PHP 并让 DB 完成工作
    【解决方案3】:

    数据库在处理大数据量方面比原生文件系统要好得多。

    在您真正遇到服务器负载问题之前,不要担心优化您的网站以减少服务器负载。 :-)

    【讨论】:

      【解决方案4】:

      您提到的表(国家和用户)通常会被 MySQL 直接缓存在内存中,除非您期望这些表中有数百万条记录。

      如果这些表不适合内存,您可能需要考虑使用通用分布式内存缓存系统,例如memcached

      【讨论】:

        【解决方案5】:

        如果您的数据库已正确索引,则从数据库中查询数据会更快。如果您想加快速度,请查看memcached 或类似名称。

        【讨论】:

          【解决方案6】:

          数据库正是为此目的。存储和提供数据。文件系统用于脚本和编程。

          如果您遇到负载问题,请考虑使用 Memcached 或其他数据库实用程序。

          您也可以考虑尝试将页面的不同部分直接缓存到数据库中作为整个部分(例如,侧边栏,不会改变太多,生成的标题部分,..)

          【讨论】:

          • 我不认为将一些生成的 HTML 放到数据库中是个好主意(是的,有时它很好,但取决于)。最好的方法是在磁盘上缓存生成的部分(见我的回答)。
          • 这取决于.. 有时最好利用数据库及其内部缓存 (+memcache),有时最好在 APC 或其他加速器的帮助下使用文件系统.. 我也同意 Mark Byerss回答,使用数据库是一个安全的选择
          【解决方案7】:

          您可以将输出(flush()、ob_flush() 等)缓存到文件和include,而不是多次读取 MySQL。缓存肯定比多次访问 MySQL 快。

          读取静态文件比通过 php 和 mysql 处理增加开销要快得多。

          【讨论】:

            【解决方案8】:

            您需要通过负载测试来评估性能以避免prematurely optimising

            通过序列化将数据存储在文件中是愚蠢的,而且很可能会增加整体负载,数据库非常擅长检索数据。

            如果在分析后确实会影响性能(除非您谈论的是大规模加载,否则我怀疑这一点),那么缓存是一个更好的解决方案。

            更重要的是要有一个设计良好的系统,以便在需要时促进变化。

            【讨论】:

              【解决方案9】:

              下面是几个脚本的链接,该脚本基本上会执行 dusoft 所说的并将输出缓冲区缓存到文件中:

              http://www.addedbytes.com/articles/caching-output-in-php/

              以这种方式使用,它更像是一种事后固定类型的解决方案,但如果在流程的早期考虑,同样的行为当然可以以更集成的方式实现。许多框架也内置了这种东西。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-09-03
                • 1970-01-01
                • 1970-01-01
                • 2017-01-01
                • 1970-01-01
                • 2013-11-09
                • 2018-04-05
                相关资源
                最近更新 更多