面试宝典系列-MySQL缓存详解

在mysql中,Query Cache默认是打开的,能够提升查询效率。mysql

但这不表明开启Query Cache就对mysql的性能有所提升。由于若是有大量的修改时,因为修改形成cache失效,会给服务器形成更大的开销。算法

控制缓存的配置是:query_cache_type,0:关闭,1:开启,2:只有select 中明确指定SQL_CACHE才缓存。sql

须要注意的是Query cache对sql的大小写敏感,由于Query Cache在内存中是以Hash结构来进行映射的,而Hash算法的基础是sql语句的字符,因此任何sql语句的改变会从新cache。缓存

缓存的生成:

  • query cache内容是select的结果集
  • prepared statement永远不会缓存,即便参数彻底一致
  • where条件中包含了某些函数永远不会缓存,如current_date, now等
  • 太大的结果集(> query_cache_limit)不会被cache

 缓存的更新和失效:

  • 在Mysql中,能够设置Query Cache所使用的总内存(query_cache_size),MySQL会把默承认以进行缓存的SQL语句的结果集进行缓存,一旦内存塞满后,就会剔除老的Query Cache对象。
  • 表数据进行任何一行的修改,基于该表相关的cache当即所有失效。为何不作智能些?由于分析cache内容太复杂,影响性能。

缓存的使用场景:

  • 当有大量的查询和大量的修改时,cache机制可能会形成性能降低。由于每次修改会致使系统去作cache失效操做,形成不小的开销。
  • 系统cache的访问由一个单一的全局锁来控制,这时候大量的查询将被阻塞,直至锁释放。

指定使用缓存和不使用缓存:

-- 指定不使用缓存
select SQL_NO_CACHE count() from t_user where tell = "153*******";

-- 指定使用缓存
select SQL_CACHE count() from t_user where tell = "153*******";

监控缓存:

使用命令:show status like ‘qcache%’;服务器

Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而获得一个空闲块。函数

Qcache_free_memory:缓存中的空闲内存。性能

Qcache_hits:每次查询在缓存中命中时就增大spa

Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。code

Qcache_lowmem_prunes:缓存出现内存不足而且必需要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;若是这个 数字在不断增加,就表示可能碎片很是严重,或者内存不多。(上面的 free_blocks和free_memory能够告诉您属于哪一种状况)对象

Qcache_not_cached:不适合进行缓存的查询的数量,一般是因为这些查询不是 SELECT 语句或者用了now()之类的函数。

Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。

Qcache_total_blocks:缓存中块的数量。

相关文章
相关标签/搜索