ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mysql查询缓存

2020-01-15 16:00:40  阅读:209  来源: 互联网

标签:缓存 Mysql Qcache 查询 次数 SQL


查询缓存

Mysql提供了一种缓存类型,会缓存整个SELECT查询结果。Mysql查询缓存保存查询返回的完整结果。
当查询命中该缓存,Mysql会立即返回结果,跳过了解析、优化和执行阶段。

以下两种情况不能被缓存:

  • 频繁更新、修改的的表,所有缓存数据都会失效,Mysql查询缓存会跟踪查询中涉及的表,如果这个表数据发生变化,所有缓存数据都会失效。
  • 查询语句中包含任何不确定的函数,此查询语句的结果是不会被缓存的。

 

Mysql如何缓存,以及判断缓存命中

Mysql如何缓存
Mysql会将缓存结果放到一张引用表中,通过一个哈希值引用,这个哈希值包括:查询语句本身,当前要查询的数据库、客户端协议的版本等。

Mysql判断缓存命中
当有查询语句时,Mysql首先检查查询缓存,如果找到缓存就返回缓存,没有找到,才会解析SQL。
1.服务器接收SQL,以SQL和一些其他条件为key查找缓存表。
2.如果找到了缓存,则直接返回缓存 。
3.如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等。
4.执行完SQL查询结果以后,将SQL查询结果缓存入缓存表。

 

 开启查询缓存

查看是否开启缓存及缓存配置相关参数

show variables like 'query'; 

缓存参数配置

如何设置参数:在my.cnf配置文件中设置

query_cache_type: 是否打开缓存 
1) OFF: 关闭 
2) ON: 总是打开 
3) DEMAND: 只有明确写了SQL_CACHE的查询才会吸入缓存
query_cache_size: 缓存使用的总内存空间大小,单位是字节,这个值必须是1024的整数倍,否则MySQL实际分配可能跟这个数值不同(感觉这个应该跟文件系统的blcok大小有关)
query_cache_min_res_unit: 分配内存块时的最小单位大小
query_cache_limit: MySQL能够缓存的最大结果,如果超出,则增加 Qcache_not_cached的值,并删除查询结果
query_cache_wlock_invalidate: 如果某个数据表被锁住,是否仍然从缓存中返回数据,默认是OFF,表示仍然可以返回
GLOBAL STAUS 中 关于 缓存的参数解释: 
Qcache_free_blocks: 缓存池中空闲块的个数 
Qcache_free_memory: 缓存中空闲内存量 
Qcache_hits: 缓存命中次数 
Qcache_inserts: 缓存写入次数 
Qcache_lowmen_prunes: 因内存不足删除缓存次数 
Qcache_not_cached: 查询未被缓存次数,例如查询结果超出缓存块大小,查询中包含可变函数等 
Qcache_queries_in_cache: 当前缓存中缓存的SQL数量 
Qcache_total_blocks: 缓存总block数

 分析与配置缓存流程:

 

 

 

缓存是否应该被使用

衡量打开缓存是否对系统有性能提升是一个很难的话题
通过缓存命中率判断, 缓存命中率 = 缓存命中次数 (Qcache_hits) / 查询次数 (Com_select)
通过缓存写入率, 写入率 = 缓存写入次数 (Qcache_inserts) / 查询次数 (Qcache_inserts)
通过 命中-写入率 判断, 比率 = 命中次数 (Qcache_hits) / 写入次数 (Qcache_inserts), 高性能MySQL中称之为比较能反映性能提升的指数,一般来说达到3:1则算是查询缓存有效,而最好能够达到10:1

缓存未命中可能原因:
查询语句无法被缓存,查询中有不确定的函数,或者查询结果太大而无法被缓存。
查询缓存的内存用完了,Mysql需要缓存"逐出",或者由于数据表被修改导致缓存失效。

缓存命中率低可能原因:
查询缓存没有完成预热,Mysql还没有集合将查询结果都缓存起来。
查询语句之前从未执行过。
缓存失效操作太多了。

标签:缓存,Mysql,Qcache,查询,次数,SQL
来源: https://www.cnblogs.com/-wenli/p/12197189.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有