是不是Redis应该缓存数据库条目?

时间:2017-12-24 10:15:09

标签: mysql nginx redis memcached mariadb

我的服务器是Debian 9.0。它有SSD硬盘,有32个RAM。和i7处理器,带有4(8)个内核。我有4个网站。其中2个非常小,两个大。大型数据库(mysql)的大小约为120 + 60 MB。我的网络服务器是nginx,也使用了清漆。

好吧,我想学习linux所以我开始阅读有关调整nginx,mysql,php-fpm等的文章。我正在调整mysql,安装了mysqltuner。它建议我设置" query_cache_size"和" query_cache_type"为0表示禁用缓存..

我做到了。但是我的网站变得非常慢。我的680 Kb网页在700毫秒内加载,但在禁用query_cache后,速度降低到将近1.5秒。很有意思。我将query_cache_size设置回128M。所以速度恢复了。我一直在阅读有关设置query_cache的更多信息并阅读Zaitsev的文章(在percona.com中),他在文章中指出使用大型缓存是有问题的,他在文章的最后说:"在许多情况下,您可能想要完全禁用查询缓存并使用外部缓存,例如没有此问题的memcached。"

https://www.percona.com/blog/2007/03/23/beware-large-query_cache-sizes/

所以,我安装了REDIS(他们说这比memcached更好,做得更好)。我安装了它,我还为redis安装了wordpress插件。我监控redis,它工作得非常好。然而,有两件事情发生了:

1)Redis没有提高我的网站速度。一样的。没有不同。也许是因为我的网页非常小(最多700 kb),我的数据库也很小。

2)当我禁用mysql查询缓存时,我的WEB SITE再次变慢。

所以,redis应该缓存所有数据库条目并使用它们比mysql快得多吗?当我禁用mysql的查询缓存时,为什么我的网页速度会降低?

1 个答案:

答案 0 :(得分:0)

我同意700毫秒太长了。设计得当,你应该能够在那段时间执行一百个MySQL查询;听起来你不是吗?

我同意大型查询缓存通常是不明智的:

  • 从其他缓存中删除RAM。
  • 对表的每次修改都会导致清除该表的QC中的所有条目。如果表经常更改,那么您将面临清除的开销,同时从缓存中获得很少或没有任何好处。

你有一个适度大小的数据库 - 一切都低于1GB?使用32 GB的RAM,您应该能够始终缓存所有数据和索引。因此,减速将是糟糕的索引和/或糟糕的查询表达。

我希望您使用的是InnoDB,而不是MyISAM。使用InnoDB,您需要将innodb_buffer_pool_size设置为不超过70%的可用 RAM。你有几个产品在32G运行?所以,我不会说32%的70%。(注意:交换对于性能来说太糟糕了。)因为你的数据很少,或许2G会是一个好的设置?

让我们在“太慢”的网页中查看查询。另外,让我们看一下SHOW CREATE TABLE表。你知道“复合”指数吗?你知道不要在函数调用中隐藏索引列吗?

也许我的cookbook可以帮助你。如果您使用WP,它会包含有关如何加快wp_postmeta的部分。如果您需要更多帮助,请使用最慢的查询,EXPLAIN及其架构启动另一个问题。