1、mysql查询缓存概述
mysql
1.基本概念算法
查询缓存的做用就是当查询接收到一个和以前一样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询。这样就大大提升了性能,节省时间sql
查询缓存彻底存储在内存空间;经过哈希表,键值判断其是否命中数据库
加速查询,也会带来开销(多了一个步骤、对写有消耗标记失效、内存的建立回收)缓存
2.查询缓命中率服务器
经过查询语句的哈希值判断:哈希值考虑的因素包括:查询自己、要查询的数据库、客户端使用协议版本...ide
查询语句任何字符上的不一样,都会致使缓存不能命中;函数
3.不能被缓存的查询性能
查询中包含用户自定义函数、存储函数、用户自定义变量、临时表、mysql库中系统表、或者包含列级权限的表、有着不肯定值的函数(Now());spa
2、查询缓存相关参数和配置
1.查询缓存变量
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%query%';
说明:
query_cache_min_res_unit:查询缓存中内存块的最小分配单位;
较小值会减小浪费,但会致使更频繁的内存分配操做;
较大值会带来浪费,会致使碎片过多;
query_cache_limit:可以缓存的最大查询结果;
对于有着较大结果的查询语句,建议在SELECT中使用SQL_NO_CACHE
query_cache_size: 查询缓存总共可用的内存空间;单位是字节,必须是1024的整数倍;
query_cache_type:ON, OFF, DEMAND(明确指明缓存才会缓存,不然所有不予缓存)
query_cache_wlock_invalidate:若是某表被其它的链接锁定,是否仍然能够从查询缓存中返回结果;默认值为OFF,表示能够在表被其它链接锁定的场景中继续从缓存返回数据;ON则表示不容许;
2.查询缓存相关的状态变量
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'Qcache%';
+---------------------------------------+-----------------+
| Variable_name | Value |
+---------------------------------------+-----------------+
| Qcache_free_blocks | 1 | 空闲内存块数,内存中可能不是连续的块,多个组成所有大小
| Qcache_free_memory | 16759688 | 空闲的内存空间
| Qcache_hits | 0 | 命中次数
| Qcache_inserts | 0 | 可缓存查询语句被放入缓存的次数
| Qcache_lowmem_prunes | 0 | 内存太少,而使用LRU算法清理的次数
| Qcache_not_cached | 0 | 可缓存却没有被缓存的结果
| Qcache_queries_in_cache | 0 | 在当前缓存空间中被缓存下的语句个数
| Qcache_total_blocks | 1 | 总共有多少内存单元
+----------------------------------------+----------------+
缓存命中率的评估公式:Qcache_hits/(Qcache_hits+Com_select)
Com_select:mysql执行的查询语句,缓存中命中是不会记录的