我正在开发一个PHP内容管理系统,并且在测试中已经注意到,几乎每个页面都会查询很多系统的MySQL表,但很少写入。我想知道的是,随着网站流量的增加,这将开始对数据库造成沉重的负担,我该如何解决/阻止这种情况?
我最初的想法是开始在文件中存储一些更静态的数据(使用PHP序列化),但这实际上是否减少了服务器负载?我担心的是,我只是将高负载从数据库传输到文件系统!
如果有人能够提供更好的方法,那就太棒了。如果数据量本身有很大影响,我会详细介绍下面我将存储的一些数据:
答案 0 :(得分:13)
您必须记住,在功能强大的服务器上和快速连接上从数据库中读取表可能比从本地计算机上的磁盘读取表更快。数据库将在内存中缓存这些小的,定期访问的表的全部内容。
通过在文件系统中自己实现相同的功能,只有很小的加速速度,但是很有可能搞砸它并使其变慢。
最好坚持使用数据库。
答案 1 :(得分:5)
优化查询(使用mysql慢查询日志)和EXPLAIN函数。
如果很少写入表,则可以使用本机MySQL缓存。您的代码中没有任何变化,只需在my.conf中启用mysql缓存。
尝试使用像Smarty(smarty.net)这样的模板引擎。它拥有自己的缓存系统,运行良好,真正减少服务器负载。
你也可以使用Memcache,但它真的值得用于真正高负荷的网站。 (我认为Smarty就足够了。)
答案 2 :(得分:2)
数据库在处理大型数据卷方面要比原生文件系统好得多。
在实际遇到服务器负载问题之前,不要担心优化站点以减少服务器负载。 : - )
答案 3 :(得分:2)
您提到的表(国家/地区和用户)通常会直接由MySQL缓存在内存中,除非您期望这些表中有数百万条记录。
如果这些表不适合内存,您可能需要考虑通用的分布式内存缓存系统,例如memcached。
答案 4 :(得分:1)
如果您的数据库已正确编入索引,则从数据库查询数据会快得多。如果您想加快速度,请查看memcached或类似内容。
答案 5 :(得分:1)
数据库正是为此目的..存储和提供数据。文件系统用于脚本和编程。
如果遇到负载问题,请考虑将Memcached或其他实用程序用于数据库。
你也可以考虑尝试将页面的不同部分直接缓存到数据库作为整个部分(例如,侧边栏,不会改变太多,生成标题部分,...)< / p>
答案 6 :(得分:0)
你可以将输出(flush(),ob_flush()等)缓存到一个文件和include
,而不是多个MySQL读取。缓存肯定比多次访问MySQL更快。
读取静态文件比通过php和mysql处理增加开销要快得多。
答案 7 :(得分:0)
您需要通过负载测试来评估性能,以避免prematurely optimising。
这很愚蠢,很可能会增加将数据存储在带序列化的文件中的总体负载,数据库非常擅长检索数据。
如果经过分析后会有真正的性能损失(我怀疑除非你在讨论大量加载),否则缓存是一个更好的解决方案。
拥有一个设计良好的系统更为重要,可以根据需要促进变革。
答案 8 :(得分:0)
这是一个指向几个脚本的链接,它基本上会执行dusoft所讨论的内容并将输出缓冲区缓存到文件中:
http://www.addedbytes.com/articles/caching-output-in-php/
以这种方式使用,它更像是一种事后解决方案,但如果在流程的早期考虑,这种相同的行为当然可以以更加集成的方式实现。许多框架也内置了这种东西。