MySQL执行过程以及查询缓存的详细介绍


当前第2页 返回上一页

1.读查询在开始之前必须先检查是否命中缓存
2.如果这个读查询可以被缓存,那么当完成执行后, MySQL若发现查询缓存中没有这个查询,会将其结果存入查询缓存,这会带来额外的系统消耗。
3.这对写操作也会有影响,因为当向某个表写入数据的时候, MySQL必须将对应表的所有缓存都设置失效。如果查询缓存非常大或者碎片很多,这个操作就可能会带来大系统消耗(设置了很多的内存给查询缓存用的时候)

如果查询缓存使用了很大量的内存,缓存失效操作就可能成为一个非常严重的问题瓶颈
如果缓存中存放了大量的查询结果,那么缓存失效操作时整个系统都可能会僵死一会

因为这个操作是靠一个全局锁操作保护的,所有需要做该操作的查询都要等待这个锁,
而且无论是检测是否命中缓存、还是缓存失效检测都需要等待这个全局锁。

(3)什么情况下查询缓存能发挥作用
理论上,可以通过观察打开或者关闭查询缓存时候的系统效率来决定是否需要开启查询。

对手那些需要消耗大量资源的查询通常都是非常适合缓存的。
例如一些汇总计算查询具体的如 COUNT()等。总地来说,对于复杂的 SELECT语句都可以使用查询缓存,
例如多表JOIN后还需要做排序和分页,这类查询每次执行消耗都很大,但是返回的结果集却很小,非常适合查询缓存。

不过需要注意的是,涉及的表上 UPDATE、 DELETE和 INSERT操作相比 SELECT来说要非常少才行。

判断查询缓存是否有效的直接数据是命中率。就是使用查询缓存返回结果占总查询的比率

不过缓存中率是一个很难判断的数值。命中率多大才是好的命中率。具体情况,具体分析。

只要查询缓存带来的效率提升大于查询缓存带来的额外消耗,即使30%命中率对系统性能提升也有很大好处。另外,缓存了哪些查询也很重要,例如,被缓存的查询本身消耗非常巨大,那么即使缓存命中率非常低,也仍然会对系统性能提升有好处

缓存未命中可能有如下几种原因:

1.查询语句无法被缓存,可能是因为查询中包含一个不确定的函数(如 CURREN_DATE)或者查询结果太大而无法缓存。这都会导致状态值 Cache not cached增加。
2.MySQL从未处理这个查询,所以结果也从不曾被缓存过。

3.还有一种情况是虽然之前缓存了查询结果,但是由于查询缓存的内存用完了,MySQL需要将某些缓存“逐出”,或者由于数据表被修改导致缓存失效。

如果你的服务器上有大量缓存未命中,但是实际上绝大数查询都被缓存了,那么一定是有如下情况发生:

1.查询缓存还没有完成预热。也就是说, MySQL还没有机会将查询结果都缓存起来。
2.查询语句之前从未执行过。如果你的应用程序不会重复执行一条查询语句,那么即使完成预热仍然会有很多缓存未命中
3.缓存失效操作太多了。

(4)如何配置 和维护查询缓存

query_cache_type

是否打开查询缓存。可以设置成0FN或 DEMAND。 DEMAND表示只有在查询语句中明确写明SQL_ CACHE的语句才放入查询缓存。这个变量可以是会话级别的也可以是全局级别的

query_cache_size

查询缓存使用的总内存空间,单位是字节。这个值必须是1024的整数倍,否则 MySQL实际分配的数据会和你指定的略有不同。

query_cahce_min_res_unit

在查询缓存中分配内存块时的最小单位。

query_chache_limit

MySQL能够缓存的最大?搜?结果。如果查询结果大于这个值,则不会被缓存。因为?搜?缓存在数据生成的时候就开始尝试缓存数据,所以只有当结果全部返回后,才知道查询结果是否超出限制

如果超出, MySQL则增加状态值 Cache_not_cached,并将结果从查询缓存中删除如果你事先知道有很多这样的情况发生,那么建议在查询语句中加入

(5)替代方案

MySQL查询缓存工作的原则是:执行查询最快的方式就是不去执行,但是查询仍然需要发送到服务器端,服务器也还需要做一点点工作。如果对于某些查询完全不需要与服务器通信效果会如何呢?这时客户端的缓存可以很大程度上帮你分担 MySQL服务器的压力

总结:

完全相同的查询在重复执行的时候,查询缓存可以立即返回结果,而无须在数据库中重新执行一次。根据我们的经验,在高并发压力环境中在询缓存会导致系统性能的下降,甚至僵死。

如果一定要使用查询缓存,那么不要设置太大内存,而且只有在确收益的时候才使用。

那该如何判断是否应该使用查询缓存呢?建议使Percona server.,观察更细致的日志,并做一些简单的计算。还可以查看缓存命中率(并不总是有用)、“ NSERTS和 SELECT比率”(这个参数也并不直观)、或者“命中和写入比率”(这个参考意义较大)。

查询缓存是一个非常方便的缓存,对应用程序完全透明,无须任何额外的编码,但是、如果希望有更高的缓存效率,我们建议使cache 或者其他类似的解决方案。

【相关推荐:MySQL视频教程】

以上就是MySQL执行过程以及查询缓存的详细介绍的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

mysql生僻字插入失败怎么办

mysql如何导入格式化数据

mysql如何实现主从复制过程的示例详解(图)

mysql的查询优化详解

mysql数据库中修改语句的语法是什么

mysql为什么选择b+树作为索引结构?(详解)

mysql怎么工作的

传智播客刘道成mysql系列视频资料分享

mysql高级知识之 架构介绍

mysql 5.5 range分区增加删除处理实例详解

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...