mariadb份额追上mysql了吗_MySQL/MariaDB的查询缓存

本文详细介绍了MySQL查询缓存的工作原理,包括缓存的数据结构(k/v对),缓存命中的判断标准,以及影响缓存的因素如敏感信息、UDF、临时表等。还展示了如何调整query_cache_size等服务器变量,并通过实例演示了缓存命中情况。
摘要由CSDN通过智能技术生成

查询缓存:

缓存的数据:k/v,即键值对;

key:查询语句的hash值;

value:查询语句的查询结果;

判断缓存是否命中标准:

通过整个查询语句的hash值的比较,完全相同则命中;

有些查询结果是不能被缓存的:

要查询的数据库中可能包含敏感信息

在查询语句中包含有用户自定义的函数(UDF);

存储函数;

用户自定义变量;

对于临时表发起的查询请求;

包含列级别授权的查询;

有着不确定结果值的mysql的内建函数:

如:NOW(), CURRENT_DATE(), CURRENT_TIME(), CURRENT_USER(),...

在mysql数据库查询缓存相关的服务器变量:MariaDB [(none)]> show global variables like 'query_cache%';

+------------------------------+---------+

| Variable_name                | Value   |

+------------------------------+---------+

| query_cache_limit            | 1048576 |

| query_cache_min_res_unit     | 4096    |

| query_cache_size             | 0       |

| query_cache_strip_comments   | OFF     |

| query_cache_type             | ON      |

| query_cache_wlock_invalidate | OFF     |

+------------------------------+---------+

6 rows in set (0.00 sec)

query_cache_limit:能够缓存的查询结果的最大字节数上限

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

query_cache_size:查询缓存申请的在内存中的总可用空间;

query_cache_strip_comments:用于控制是否去掉SQL查询语句中的注释部分之后在作为key存入查询缓存中。

query_cache_type:缓存功能开启与否的开关:

query_cache_wlock_invalidate:如果某个连接会话对某表施加了写锁,是否依然可以从缓存中查询并返回查询结果;

想要查看缓存服务器状态参数,就要设置查询缓存申请的内存空间的大小,必须是1024的整数倍;MariaDB [(none)]> set @@global.query_cache_size=134217728;

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> show global status like 'Qcache%';

+-------------------------+-----------+

| Variable_name           | Value     |

+-------------------------+-----------+

| Qcache_free_blocks      | 1         |

| Qcache_free_memory      | 134198384 |

| Qcache_hits             | 1         |

| Qcache_inserts          | 1         |

| Qcache_lowmem_prunes    | 0         |

| Qcache_not_cached       | 1         |

| Qcache_queries_in_cache | 1         |

| Qcache_total_blocks     | 4         |

+-------------------------+-----------+

8 rows in set (0.00 sec)

Qcache_free_blocks:表示查询缓存中目前还剩余多少个blocks;

Qcache_free_memory:查询缓存中还空闲的内存空间;

Qcache_hits:表示查询缓存中查询语句的命中次数。数字越大,缓存效果越理想;

Qcache_lowmem_prunes:该参数记录了有多少条查询请求是因为内存空间不足而基于LRU算法被移出缓存的;如果该数值较大,则表示为查询缓存分配的内存空间太小;

Qcache_not_cached:取决于query_cache_type变量的设置的作用下,没有被缓存的查询请求的数量;

Qcache_queries_in_cache:当前查询缓存中缓存的查询请求的结果的数量;

Qcache_total_blocks:当前查询缓存中总计分配了多少个block;

缓存命中率的计算:

Qcache_hits/(Qcache_hits + Qcache_inserts)

通过查看服务器参数区别,来判断是否命中缓存;

首先,查看表内容,然后查看参数,在查看表内容,在查看参数;MariaDB [hellodb]> select * from coc;

+----+---------+----------+

| ID | ClassID | CourseID |

+----+---------+----------+

|  1 |       1 |        2 |

|  2 |       1 |        5 |

|  3 |       2 |        2 |

|  4 |       2 |        6 |

|  5 |       3 |        1 |

|  6 |       3 |        7 |

|  7 |       4 |        5 |

|  8 |       4 |        2 |

|  9 |       5 |        1 |

| 10 |       5 |        9 |

| 11 |       6 |        3 |

| 12 |       6 |        4 |

| 13 |       7 |        4 |

| 14 |       7 |        3 |

+----+---------+----------+

14 rows in set (0.00 sec)

MariaDB [hellodb]> show global status like 'Qcache%';

+-------------------------+-----------+

| Variable_name           | Value     |

+-------------------------+-----------+

| Qcache_free_blocks      | 1         |

| Qcache_free_memory      | 134198384 |

| Qcache_hits             | 0         |

| Qcache_inserts          | 1         |

| Qcache_lowmem_prunes    | 0         |

| Qcache_not_cached       | 1         |

| Qcache_queries_in_cache | 1         |

| Qcache_total_blocks     | 4         |

+-------------------------+-----------+

8 rows in set (0.00 sec)

MariaDB [hellodb]> select * from coc;

+----+---------+----------+

| ID | ClassID | CourseID |

+----+---------+----------+

|  1 |       1 |        2 |

|  2 |       1 |        5 |

|  3 |       2 |        2 |

|  4 |       2 |        6 |

|  5 |       3 |        1 |

|  6 |       3 |        7 |

|  7 |       4 |        5 |

|  8 |       4 |        2 |

|  9 |       5 |        1 |

| 10 |       5 |        9 |

| 11 |       6 |        3 |

| 12 |       6 |        4 |

| 13 |       7 |        4 |

| 14 |       7 |        3 |

+----+---------+----------+

14 rows in set (0.00 sec)

MariaDB [hellodb]> show global status like 'Qcache%';

+-------------------------+-----------+

| Variable_name           | Value     |

+-------------------------+-----------+

| Qcache_free_blocks      | 1         |

| Qcache_free_memory      | 134198384 |

| Qcache_hits             | 1         |

| Qcache_inserts          | 1         |

| Qcache_lowmem_prunes    | 0         |

| Qcache_not_cached       | 1         |

| Qcache_queries_in_cache | 1         |

| Qcache_total_blocks     | 4         |

+-------------------------+-----------+

8 rows in set (0.00 sec)

通过Qcache_hits参数比较,可以发现,通过Qcache_inserts添加缓存之后,再次输入查询语句,是从缓存中提取的结果;

需要注意,如果对表进行了写操作(增、删、改),则MySQL会自动将查询缓存中与该表相关的所有缓存项全部清除;因此,与此表相关的查询请求必须重新构建缓存内容;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值