1.Query cache介绍
作用于整个 MySQL Instance,主要用来缓存 MySQL 中的 ResultSet,也就是一条SQL语句执行的结果集,所以仅仅只能针对select语句。当我们打开了 Query Cache 功能,MySQL在接受到一条select语句的请求后,如果该语句满足Query Cache的要求(未显式说明不允许使用Query Cache,或者已经显式申明需要使用Query Cache),MySQL 会直接根据预先设定好的HASH算法将接受到的select语句以字符串方式进行hash,然后到Query Cache 中直接查找是否已经缓存。也就是说,如果已经在缓存中,该select请求就会直接将数据返回,从而省略了后面所有的步骤(如 SQL语句的解析,优化器优化以及向存储引擎请求数据等),极大的提高性能。
当然,Query Cache 也有一个致命的缺陷,那就是当某个表的数据有任何任何变化,都会导致所有引用了该表的select语句在Query Cache 中的缓存数据失效。所以,当我们的数据变化非常频繁的情况下,使用Query Cache 可能会得不偿失。
Query Cache的使用需要多个参数配合,其中最为关键的是 query_cache_size 和 query_cache_type ,前者设置用于缓存 ResultSet 的内存大小,后者设置在何场景下使用 Query Cache。在以往的经验来看,如果不是用来缓存基本不变的数据的MySQL数据库,query_cache_size 一般 256MB 是一个比较合适的大小。当然,这可以通过计算Query Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))来进行调整。query_cache_type可以设置为0(OFF),1(ON)或者2(DEMOND),分别表示完全不使用query cache,除显式要求不使用query cache(使用sql_no_cache)之外的所有的select都使用query cache,只有显示要求才使用query cache(使用sql_cache)。
2.关于sql语句是否缓存设置:
可以在SELECT语句中指定查询缓存相关选项:· SQL_CACHE
如果query_cache_type系统变量的值是ON或DEMAND,查询结果被缓存。
· SQL_NO_CACHE
查询结果不被缓存。
示例:
SELECT SQL_CACHE id, name FROM customer;SELECT SQL_NO_CACHE id, name FROM customer;query_cache_type介绍:0或OFF将阻止缓存或查询缓存结果。
1或ON将允许缓存,以SELECT SQL_NO_CACHE开始的查询语句除外。
2或DEMAND,仅对以SELECT SQL_CACHE开始的那些查询语句启用缓存
3.命中后的次数更新问题?如果从查询缓存中返回一个查询结果,服务器把Qcache_hits状态变量的值加一,而不是Com_select变量SELECT查询的总数量等价于:
Com_select+ Qcache_hits+ queries with errors found by parserCom_select的值等价于:
Qcache_inserts+ Qcache_not_cached+ queries with errors found during columns/rights check4.是不是加了空格就就不会被缓存?mysql会对输入的query进行预处理,将空格等东西给处理掉,所以开头的空格不会影响到query_cache,因为对mysql来说,就是一条query。但如果中间加了空格,会被认为是2条不同的query.
1145

被折叠的 条评论
为什么被折叠?



