免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4002 | 回复: 8
打印 上一主题 下一主题

mysql查询缓存工作原理的一些疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-19 09:37 |只看该作者 |倒序浏览
看到一篇关于mysql查询缓存的介绍,有一些疑问,拿出来问问。原文连接如下:
http://tianchunfeng.spaces.live. ... A1808A272!315.entry

疑问1:对于子查询,内联视图和部分union的查询是不缓存的。
因为平时写的查询语句基本都是有子查询的,是不是说这些查询的结果就都不缓存了?(这样看来mysql的查询缓存好象不是很好用)。
对部分union不缓存,那对于join缓存吗?

疑问2:缓存查询失效的粒度级别是表,当表被修改时,所有与改表相关的缓存立即失效。
那就是说,如果我的缓存里存了1000个和A表有关的结果集,一旦我对这个表做一个修改,这1000个结果集全都被清出去了?这样是不是可以理解为如果一张表经常做修改,那对它使用查询缓存的效果就不是很好(感觉很可怕,因为我们的主表都是几十万的数据,而且修改的次数和查询的次数差不多,那也就是代表查询缓存基本没有起效果????)

疑问3:查询缓存是否支持事务处理?

疑问4:mysql的查询缓存只缓存结果集。这就要求查询语句必须是完全一致的。
综合疑问1来看,又不能缓存子查询,查询条件要一致才可以使用结果集,那我觉得mysql查询缓存的利用率好象不是很好。而且我们每次查询如果不在缓存里,系统的io就好高。这种情况有没有别的配置可以缓解?

论坛徽章:
0
2 [报告]
发表于 2007-10-22 19:41 |只看该作者
自己顶

论坛徽章:
0
3 [报告]
发表于 2007-10-22 22:53 |只看该作者
路过,顶下:)

论坛徽章:
0
4 [报告]
发表于 2007-10-23 10:19 |只看该作者
原帖由 ireneyao 于 2007-10-19 09:37 发表
看到一篇关于mysql查询缓存的介绍,有一些疑问,拿出来问问。原文连接如下:
http://tianchunfeng.spaces.live. ... A1808A272!315.entry

疑问1:对于子查询,内联视图和部分union的查询是不 ...

我来回答。。。。。。。。。呵呵

1。query cache是对整个query有效,一个query内部嵌套的subquery不会用到query cache;使用cache的query必须严格一致,大小写一也必须一样。所以union、join都不会在query cache中。其实可以做实验,这样自己最清楚了。
2。所谓“粒度级别”啥意思?lz的说法是正确的,只要有一个改动,该表相关query全部从query cache清空。至于你们使用的表,这个要看情况了,你可以看qcache的使用情况来决定query cache是好处多呢,还是坏处多,然后来决定是否使用。
3。query cache不是引擎级别的,支持innodb
4。没错,语句必须完全一致;但不是所谓的“只缓存结果集”,语句也要cache,不然怎么去比较前后的语句?利用率问题,要自己看状态了,是否值得用。

有时候灌水也是很累的事情。。。。。。。。。。。。。。

论坛徽章:
0
5 [报告]
发表于 2007-10-23 10:39 |只看该作者
谢谢楼上的回答
再问一个比较白的问题,对于问题一,就是说类似select a from table_A where id=11111
mysql直接就不缓存啊?那我们所有的sql语句都是有where的。全都不缓存?还是缓存了前半部分?就是select a from table_A?

论坛徽章:
0
6 [报告]
发表于 2007-10-23 15:44 |只看该作者
原帖由 ireneyao 于 2007-10-23 10:39 发表
谢谢楼上的回答
再问一个比较白的问题,对于问题一,就是说类似select a from table_A where id=11111
mysql直接就不缓存啊?那我们所有的sql语句都是有where的。全都不缓存?还是缓存了前半部分?就是 ...

select a from table_A where id=11111结果是被缓存的
如果你开启了query_cache

论坛徽章:
0
7 [报告]
发表于 2007-10-23 18:15 |只看该作者
恩,谢谢楼上的回答,我这个贴子的前提就是开启查询缓存了
结果被缓存,那查询语句呢?mysql不缓存子查询的,那是不是说查询语句缓存前半部分?

论坛徽章:
0
8 [报告]
发表于 2007-10-24 09:53 |只看该作者
自己做个实验啊,老兄,这样就非常清楚了

论坛徽章:
0
9 [报告]
发表于 2007-10-24 16:30 |只看该作者
原帖由 ireneyao 于 2007-10-23 18:15 发表
恩,谢谢楼上的回答,我这个贴子的前提就是开启查询缓存了
结果被缓存,那查询语句呢?mysql不缓存子查询的,那是不是说查询语句缓存前半部分?

select a from table_A where id=11111  
这是一句啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP