mysql缓存失效时间_mysql – 频繁查询缓存失效的开销是否值得?

您应该只使用禁用查询缓存

[mysqld]

query_cache_size = 0

然后重启mysql.我为什么要建议???

查询缓存总是与InnoDB对接.如果修改不影响其他事务的可重复读取,那么如果InnoDB的MVCC允许从查询缓存提供查询,那将是很好的.不幸的是,InnoDB只是不这样做.显然,您有很多查询会很快失效并且可能没有被重用.

对于MySQL 4.0下的InnoDB,对事务禁用了查询缓存.对于MySQL 4.1,InnoDB在允许以每个表为基础访问查询缓存时播放流量警察.

从你的问题的角度来看,我会说删除查询缓存的理由不是开销,而是InnoDB如何管理它.

如果您的全部或大部分数据都是MyISAM,那么您可以使用您最初使用SQL_NO_CACHE的想法.

如果您混合使用InnoDB和MyISAM,则必须根据缓存未命中的高度为应用程序找到合适的平衡点.事实上,pages 209-210 of the same book指出缓存未命中的原因:

The query is not cacheable, either because it contains a nondeterministic construct (such as CURRENT_DATE) or because its

result set is too large to store.Both types of uncacheable queries

increment the Qcache_not_cached status variable.

The server has never seen the query before, so it never had the chance to cache its result.

The query’s result was previously cached, but the server removed it. This can happen because there wasn’t enough memory to keep it, because

someone instructed the server to remove it, or because it was

invalidated

并且具有少量不可缓存查询的高缓存未命中的根本原因可能是:

The query cache is not warm yet. That is the server hasn’t had a chance to fill the cache with result sets.

The server is seeing queries it hasn’t seen before. If you do not have a lot of repeated queries, this can happen even after the cache

is warmed up.

There are a lot of cache invalidations.

更新2012-09-06 10:10美国东部时间

查看最新的更新信息,您将query_cache_limit设置为1048576(1M).这会将任何结果集限制为1M.如果你检索更大的东西,它将不会被缓存.虽然您已将query_cache_size设置为104857600(100M),但这仅允许在完美世界中设置100个缓存结果.如果执行数百个查询,碎片将会很快发生.您还有4096(4K)作为最小尺寸结果集.不幸的是,mysql没有内部机制来对查询缓存进行碎片整理.

如果您必须具有查询缓存并且有如此多的RAM,则可以执行以下操作:

SET GLOBAL query_cache_size = 0;

SELECT SLEEP(60);

SET GLOBAL query_cache_size = 1024 * 1024 * 1024;

为了清除查询缓存.您丢失了所有缓存的结果,因此请在非高峰时段运行这些行.

我还会分配以下内容:

> query_cache_size = 1G

> query_cache_limit = 8M

这留下了23G的RAM.我想提出以下几点:

> innodb_buffer_pool_size = 12G

> key_buffer_size = 4G

那留下了7G.这应该足以用于OS和DB连接.

请记住,密钥缓冲区仅缓存MyISAM索引页,而InnoDB缓冲池缓存数据和索引.

还有一个建议:升级到MySQL 5.5,这样你就可以为多个CPU配置InnoDB,为读/写I / O配置多个线程.

请参阅我之前关于使用MySQL 5.5以及访问InnoDB的多个CPU的帖子

更新2012-09-06 14:56美国东部时间

我清除查询缓存的方法相当极端,因为它隐藏了缓存数据并形成了完全不同的RAM段.正如您在评论中指出的那样,FLUSH QUERY CACHE(如您所建议的)甚至重置QUERY CACHE会更好.为了澄清,当我说“没有内部机制”时,我就是这么说的.需要进行碎片整理,必须手动完成. It would need to be crontab’d.

如果你在InnoDB上比在MyISAM上更频繁地进行DML(INSERT,UPDATE,DELETE),我会说完全删除查询缓存,我在开头就说过了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值