MySQL查询缓存

  


<强>

MySQL查询缓存是用来缓存我们所执行的选择语句以及该语句的结果集,MySQL在实现查询缓存的具体技术细节上类似典型的KV存储,就是将选择语句和该查询语句的结果集做了一个散列映射并保存在一定的内存区域中。当客户端发起SQL查询时,查询缓存的查找逻辑是,先对SQL进行相应的权限验证,接着就通过查询缓存来查找结果(注意必须是完全相同,即使多一个空格或者大小写不同都认为不同,即使完全相同的SQL,如果使用不同的字符集,不同的协议等也会被认为是不同的查询而分别进行缓存)。它不需要经过优化器模块进行执行计划的分析优化,更不需要发生同任何存储引擎的交互,减少了大量的磁盘IO和CPU运算,所以有时候效率非常高。


<强>

判断一个缓存是否被命中,通过查询语句的散列值来判断,哈希值因素包括查询语句,查询数据库,客户端版本协议等,如查询语句任何字符的不同,都会导致希结果的不同,都可能导致缓存无法命中。有些查询不能被缓存,如查询中包含UDF,存储函数,用户自定义变量,临时表,MySQL库中系统表,或者包含列级权限的表,有着不确定值的函数(现在());查询缓存是完全存储在内存中的,对整个内存空间分配回收等,会额外产生系统资源消耗,这会导致内存碎片的产生。


MariaDB [(一)]祝辞,show  global  variables  like “% %查询”;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - +   |,Variable_name ,,,,,,,,,,,,,,, |, Value ,,,,,,,,,,,, |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - +   |,expensive_subquery_limit ,,,, |, 100,,,,,,,,,,,,,,, |   |,ft_query_expansion_limit ,,,, |, 20,,,,,,,,,,,,,,,, |   |,have_query_cache ,,,,,,,,,,,, |, YES ,,,,,,,,,,,,,, |   |,long_query_time ,,,,,,,,,,,,, |, 10.000000,,,,,,,,, |   |,query_alloc_block_size ,,,,,, |, 16384,,,,,,,,,,,,, |   |,query_cache_limit ,,,,,,,,,,, |, 1048576,,,,,,,,,,, |   |,query_cache_min_res_unit ,,,, |, 4096,,,,,,,,,,,,,, |   |,query_cache_size ,,,,,,,,,,,, |, 16777216,,,,,,,,,, |   |,query_cache_strip_comments ,, |, OFF ,,,,,,,,,,,,,, |   |,query_cache_type ,,,,,,,,,,,, |,,,,,,,,,,,,,,,,, |   | |,query_cache_wlock_invalidate  OFF ,,,,,,,,,,,,,, |   |,query_prealloc_size ,,,,,,,,, |, 24576,,,,,,,,,,,,, |   |,slow_query_log ,,,,,,,,,,,,,, |, OFF ,,,,,,,,,,,,,, |   |,slow_query_log_file ,,,,,,,,, |, localhost-slow.log  |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - +   14,rows  set 拷贝;(0.01,sec)

查询缓存相关变量说明

<强> query_cache_min_res_unit :查询缓存中内存块的最小分配单位;较小值会减少浪费,但会导致更频繁的内存分配操作,较大值会带来浪费,会导致碎片过多;

<强> query_cache_limit 强:能够缓存的最大查询结果;对于有着较大结果的查询语句,建议在选择中使用SQL_NO_CACHE

<强> query_cache_size :查询缓存总共可用的内存空间;单位是字节,必须是1024的整数倍;

<强> query_cache_type :> MariaDB [(一)]祝辞,show  global  status  like “Qcache %”;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   |,Variable_name ,,,,,,,,,, |, Value ,, |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   |,Qcache_free_blocks ,,,,, |, 1,,,,,,, |   |,Qcache_free_memory ,,,,, |, 16759656 |   |,Qcache_hits ,,,,,,,,,,,, |, 0,,,,,,, |   |,Qcache_inserts ,,,,,,,,, |, 0,,,,,,, |   |,Qcache_lowmem_prunes ,,, |, 0,,,,,,, |   null   null   null   null   null

MySQL查询缓存