一、mysql查询缓存概述

  1.基本概念

         查询缓存的作用就是当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询。这样就大大提高了性能,节省时间

        查询缓存完全存储在内存空间;通过哈希表,键值判断其是否命中

        加速查询,也会带来开销(多了一个步骤、对写有消耗标记失效、内存的创建回收)

  2.查询缓命中率

         通过查询语句的哈希值判断:哈希值考虑的因素包括查询本身、要查询的数据库、客户端使用协议版本...

         查询语句任何字符上的不同,都会导致缓存不能命中;

  3.不能被缓存的查询

        查询中包含用户自定义函数、存储函数、用户自定义变量、临时表、mysql库中系统表、或者包含列级权限的表、有着不确定值的函数(Now());

 

 

二、查询缓存相关参数和配置

  1.查询缓存变量

       MariaDB [(none)]> SHOW GLOBAL VARIABLES  LIKE '%query%';

MySQL系列:查询缓存参数_第1张图片

    说明:

query_cache_min_res_unit查询缓存中内存块的最小分配单位;

                                                    较小值会减少浪费,但会导致更频繁的内存分配操作;

                                                    较大值会带来浪费,会导致碎片过多;

query_cache_limit能够缓存的最大查询结果;

                                     对于有着较大结果的查询语句,建议在SELECT中使用SQL_NO_CACHE

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

query_cache_typeON, 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_selectmysql执行的查询语句,缓存中命中是不会记录的