这期内容当中小编将会给大家带来有关MySQL数据库中怎么查询缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
<强>一、缓存条件,原理强>
MySQL查询缓存是用来缓存我们所执行的选择语句以及该语句的结果集,MySQL在实现查询,缓存的具体技术细节上类似典型的KV存储,就是将选择语句和该查询语句的结果集做了一个散列映射并保存在一定的内存区域中。当客户端发起SQL查询时,查询,缓存的查找逻辑是,先对SQL进行相应的权限验证,接着就通过查询,缓存来查找结果(注意必须是完全相同,即使多一个空格或者大小写不同都认为不同,即使完全相同的SQL,如果使用不同的字符集,不同的协议等也会被认为是不同的查询而分别进行缓存)。它不需要经过优化器模块进行执行计划的分析优化,更不需要发生同任何存储引擎的交互,减少了大量的磁盘IO和CPU运,算,所以有时候效率非常高。
<强>查询缓存的工作流程如下:强>
<强> 1:命中条件强>
缓存存在一个哈希表中,通过查询SQL,查询数据库,客户端协议等作为关键。在判断是否命中前,MySQL不会解析SQL,而是直接使用SQL去查询缓存,SQL任何字符上的不同,如空格,注释,都会导致缓存不命中。
如果查询中有不确定数据,例如当前日期()和()现在函数,那么查询完毕后则不会被缓存。所以,包含不确定数据的查询是肯定不会找到可用缓存的
2:工作流程
服务器接收SQL,以SQL和一些其他条件为key查找缓存表(额外性能消耗)
如果找到了缓存,则直接返回缓存(性能提升)
如果没有找到缓存,则执行SQL查询,包括原来的SQL解析,优化等.
执行完SQL查询结果以后,将SQL查询结果存入缓存表(额外性能消耗)
二、相关SQL语句
2.1、查看SQL缓存参数:show variables like '%query_cache%';
其中各个参数的意义如下:
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个 数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。
2.2、开启SQL缓存:set global query_cache_type=1;
2.3、关闭SQL缓存:set global query_cache_type=0;
2.4、设置缓存空间:set global query_cache_size=1024*1024*64 (64M)
2.5、固定SQL语句声明不适用缓存:select sql_no_cache * from 表名
注意:改变SQL语句的大小写或者数据表有数据改动,则不会调用缓存。
2.6、配置查询缓存
vi /etc/my.cnf query_cache_size=300M query_cache_type=1
三、清除缓存
mysql的FLUSH句法(清除缓存)
FLUSH flush_option [,flush_option]
如果你想要清除一些MySQL使用内部缓存,你应该使用FLUSH命令。为了执行FLUSH,你必须有reload权限。
flush_option可以是下列任何东西:
HOSTS 这个用的最多,经常碰见。主要是用来清空主机缓存表。如果你的某些主机改变IP数字,或如果你得到错误消息Host ... isblocked,你应该清空主机表。当在连接MySQL服务器时,对一台给定的主机有多于,max_connect_errors个错误连续不断地发生,MySQL为了安全的需要将会阻止该主机进一步的连接请求。清空主机表允许主机再尝试连接。
MySQL数据库中怎么查询缓存