【问题标题】:Gains and performance degradation when caching MySQL results缓存 MySQL 结果时的增益和性能下降
【发布时间】:2017-04-16 02:56:40
【问题描述】:
我已经看到一些框架使用文件系统中的常用文件缓存来自数据库的结果(在这种情况下不考虑内存缓存的数据),一旦对数据库进行更改或特定的 TTL 结束,这些结果就会失效。由于数据库也是一个文件,因此它对我来说似乎有点多余,除了在一个用例中,从不同来源对数据库进行大量并发 SELECT 查询以将负载分配到不同的文件。
除了体面的设计和抽象之外,还有什么理由将这种缓存技术用于流量和并发性几乎可以忽略不计的小型私人项目?
【问题讨论】:
标签:
php
mysql
performance
caching
load
【解决方案1】:
经验法则:不要将缓存放在缓存前面。 MySQL 已经做了一些工作来避免做 I/O;您描述的缓存似乎增加了 I/O 负载。
此外,如果缓存机制增加了 RAM 消耗,那么它会占用原本可以用来加速 MySQL 的 RAM。例如,不要将 memcached 与 MySQL 放在同一台服务器上。 Memcached 需要大量 RAM。
KISS -- 你不是一个小项目吗?为什么要用不太可能带来太多好处的东西来复杂化呢。
如果你的应用程序很慢,那可能是因为
- 缺少“复合”索引;
- 一个糟糕的公式
SELECT;
- 十几种不太常见但易于修复的原因中的任何一种。
但很少因为没有使用额外的缓存。
【解决方案2】:
缓存有助于两件事:
- 大数据集、复杂查询(连接、联合、子查询等)
- 数据库服务器查询解析
处理缓存时要问自己的问题:
- 我的数据是否经常更改?
- 如果我使用它会提高速度吗?
如果您的数据经常更改或性能提升可以忽略不计,我建议不要缓存。维护并确保它没有损坏等是另一回事。如果性能明显更好,那就去吧。
此外,基于文件的缓存通常很慢并且仅用于大数据集