Michal Charemza Asked: 2014-04-18 04:45:59 +0800 CST2014-04-18 04:45:59 +0800 CST 2014-04-18 04:45:59 +0800 CST 如何决定是否使用 InnoDB 启用 MySQL 查询缓存 772 在仅使用 InnoDB 表的服务器上,应该如何决定启用/禁用 MySQL 查询缓存。比如说,如果启用了缓存,那么应该如何输出: SHOW STATUS LIKE 'Qcache%'; 被解释做出决定?或者可以执行哪些其他查询/分析来获取更多信息,然后应该如何解释这些信息?如果要启用,它的大小应该如何确定?我在 Amazon RDS 上,使用 MySQL 5.6。我最终将成为大约 250 个独立的数据库,总空间约为 200gb。 mysql innodb 3 个回答 Voted Best Answer Rick James 2015-02-02T18:48:27+08:002015-02-02T18:48:27+08:00 SHOW GLOBAL STATUS; 然后计算这些(无论是使用 MyISAM 还是 InnoDB): Qcache_lowmem_prunes / Uptime-- QC 被修剪的频率 -- 超过 15/秒表示开启 QC 有很多开销。 Qcache_not_cached / Uptime-- 缓存尝试失败(每秒)。> 40 可能很糟糕。 Qcache_not_cached / (Qcache_hits + Com_select + Qcache_not_cached)-- 其中的百分比SELECTs没有缓存在 QC 中 -- >30% 意味着 QC 不是很有用。 Qcache_hits / Qcache_inserts-- 命中插入比 -- > 10 是可取的 RolandoMySQLDBA 2014-04-18T07:47:58+08:002014-04-18T07:47:58+08:00 我在之前的帖子中讨论过这个 Sep 05, 2012:频繁查询缓存失效的开销值得吗? Sep 26, 2013:查询缓存命中值在我的数据库中没有改变 InnoDB 内部对查询缓存有一种非常实用的方法,因为它对查询缓存条目失效进行了微观管理。在 MySQL 4.x 时代,为了 InnoDB,查询缓存默认是禁用的。在 MySQL 5.x 中,它可能是一个折腾。@akuzminsky 的评论显示了围绕 InnoDB 的本地问题。 鉴于您使用的是 Amazon RDS,您会发现以下挑战 更改一些 InnoDB 设置可能很麻烦 某些 InnoDB 设置无法更改 由于 RDS,InnoDB 的调优方面存在限制 我会取消任何猜测工作,只禁用查询缓存。如果有更大的缓冲池大小(如@akuzminsky 的第二条评论中所建议),您将不得不迁移到更大的服务器模型($$$ Cha-Ching $$$)。以下是服务器模型的缓冲池大小 MODEL max_connections innodb_buffer_pool_size --------- --------------- ----------------------- t1.micro 34 326107136 ( 311M) m1-small 125 1179648000 ( 1125M, 1.097G) m1-large 623 5882511360 ( 5610M, 5.479G) m1-xlarge 1263 11922309120 (11370M, 11.103G) m2-xlarge 1441 13605273600 (12975M, 12.671G) m2-2xlarge 2900 27367833600 (26100M, 25.488G) m2-4xlarge 5816 54892953600 (52350M, 51.123G) Ross 2014-12-21T06:48:02+08:002014-12-21T06:48:02+08:00 这实际上取决于一般数据的读写拆分。如果它的读取量很大,那么您可以通过巧妙地使用 query_cache 来节省 RDS 中的 CPU 负载。但是,我绝不建议将其默认设置为 ON,而是使用 DEMAND(RDS 参数中的数字 2),这样您就可以在 select 语句中使用 SQL_CACHE 进行特别繁琐的查询,以避免潜在地进入磁盘(这在RDS 通常),同时仍然没有 query_cache 和数据过期以失控的方式接管您的数据库。 使用选项 2 应该可以让您的 query_cache_size 保持较小并避免驱逐,同时仍然为缓存最差的查询执行结果提供足够的空间。在读取繁重的情况下,这为我们使用 500GB RDS 数据库的最慢查询带来了良好的加速,同时不会给系统带来负担。 高温高压
SHOW GLOBAL STATUS;
然后计算这些(无论是使用 MyISAM 还是 InnoDB):
Qcache_lowmem_prunes / Uptime
-- QC 被修剪的频率 -- 超过 15/秒表示开启 QC 有很多开销。Qcache_not_cached / Uptime
-- 缓存尝试失败(每秒)。> 40 可能很糟糕。Qcache_not_cached / (Qcache_hits + Com_select + Qcache_not_cached)
-- 其中的百分比SELECTs
没有缓存在 QC 中 -- >30% 意味着 QC 不是很有用。Qcache_hits / Qcache_inserts
-- 命中插入比 -- > 10 是可取的我在之前的帖子中讨论过这个
Sep 05, 2012
:频繁查询缓存失效的开销值得吗?Sep 26, 2013
:查询缓存命中值在我的数据库中没有改变InnoDB 内部对查询缓存有一种非常实用的方法,因为它对查询缓存条目失效进行了微观管理。在 MySQL 4.x 时代,为了 InnoDB,查询缓存默认是禁用的。在 MySQL 5.x 中,它可能是一个折腾。@akuzminsky 的评论显示了围绕 InnoDB 的本地问题。
鉴于您使用的是 Amazon RDS,您会发现以下挑战
我会取消任何猜测工作,只禁用查询缓存。如果有更大的缓冲池大小(如@akuzminsky 的第二条评论中所建议),您将不得不迁移到更大的服务器模型($$$ Cha-Ching $$$)。以下是服务器模型的缓冲池大小
这实际上取决于一般数据的读写拆分。如果它的读取量很大,那么您可以通过巧妙地使用 query_cache 来节省 RDS 中的 CPU 负载。但是,我绝不建议将其默认设置为 ON,而是使用 DEMAND(RDS 参数中的数字 2),这样您就可以在 select 语句中使用 SQL_CACHE 进行特别繁琐的查询,以避免潜在地进入磁盘(这在RDS 通常),同时仍然没有 query_cache 和数据过期以失控的方式接管您的数据库。
使用选项 2 应该可以让您的 query_cache_size 保持较小并避免驱逐,同时仍然为缓存最差的查询执行结果提供足够的空间。在读取繁重的情况下,这为我们使用 500GB RDS 数据库的最慢查询带来了良好的加速,同时不会给系统带来负担。
高温高压