查询缓存中表数据_超详细的mysql数据库查询缓存总结,值得收藏

概述

查询缓存(Query Cache,简称QC),存储SELECT语句及其产生的数据结果。闲来无事,做一下这块的总结,也做个备忘!

dacca5c1963c6b25e0a9de5b04dd0852.png

工作原理

查询缓存工作原理如下:

缓存SELECT操作的结果集和SQL语句,key为sql,value为查询结果集;

如果新的SELECT语句到了,以这个sql为key去缓存中查询,如果匹配,就把缓存的结果集返回;

匹配标准:与缓存的SQL语句是否完全一样,sql中字母区分大小写以及中间的空格,简单理解为存储了一个key-value结构,key为sql,value为sql查询结果,匹配时使用Java的String的equals(),例如:

select age from user 与 select AGE from user不会匹配,因为大小写不同;select age from use 与 select age from user不会匹配,因为空格不同;

sql两边的空格可忽略,可以认为是对key进行过trim操作之后再进行equals比较。


查看mysql设置参数

执行

show variables like '%query_cache%';
0a71bf661ef2b517a4ae3a7fbd4e1174.png

可以看到相关参数:

query_cache_type:0-不启用查询缓存;1-启用,2-启用,默认值为0; query_cache_size:设置缓存区总大小,允许设置query_cache_size的值最小为40K,默认1M,推荐设置为:64M/128M;query_cache_limit:限制缓存区最大能缓存的单条查询记录集大小,默认设置为1M

query_cache_type为1时,只要符合查询缓存的要求,客户端的查询语句和记录集都可以缓存起来,如果SQL中加上 SQL_NO_CACHE将不缓存;

query_cache_type为2时,只要SQL中添加了参数:SQL_CACHE,且符合查询缓存的要求,客户端的查询语句和记录集,则可以缓存起来。


查看缓存使用情况

show status like '%Qcache%%';
03d66863850d50fc52d75d528b71f294.png

可以看到相关参数:

Qcache_hits:缓存命中次数;Qcache_inserts:缓存中插入次数,每缓存一次加1,注意这个不是缓存数量;

开启查询缓存

设置选项query_cache_type = 1 ,同时设置query_cache_size = 67108864;

注:query_cache_size的值设置在100MB以内即可。在MySQL里查询缓存是由一个全局锁在控制,每次更新查询缓存的内存块都需要进行锁定。


关闭查询缓存

设置选项query_cache_type = 0,同时设置query_cache_size = 0。


适用场景

用于频繁提交同一个语句,并且该表数据变化不是很频繁的场景,例如一些静态页面,或者页面中的某块不经常发生变化的信息。

由于查询缓存需要缓存最新数据结果,因此表数据发生任何变化(insert、update、delete或其他可能产生数据变化的操作),都会导致查询缓存被刷新。因而,对于一个更新频率非常低而只读查询频率非常高的场景下,打开查询缓存还是比较有优势的。


不适用场景

查询缓存严格要求2次SQL请求要完全一样,包括SQL语句,连接的数据库、协议版本、字符集等因素都会影响。下面为查询缓存不适用的几个场景:

  1. 子查询;
  2. 过程、函数、触发器、event中调用的SQL,或者引用到这些结果的;
  3. 查询中涉及一些特殊函数时,例如:BENCHMARK()、CURDATE()、CURRENT_TIME()、CURRENT_TIMESTAMP()、NOW()、SLEEP()、CONNECTION_ID()、CURRENT_DATE()、CURRENT_USER()、PASSWORD()、RAND()、UUID()、ENCRYPT()、LAST_INSERT_ID()等等;
  4. 查询涉及到mysql,information_schema或performance_schema。
  5. 类似SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE、SELECT..INTO OUTFILE/DUMPFILE、SELECT * FROM ... WHERE autoincrement_col IS NULL的查询;
  6. SELECT执行计划用到临时表;
  7. 未引用任何表的查询,例如SELECT 1+2;
  8. 查询产生了告警(warnings);
  9. SELECT语句中存在SQL_NO_CACHE关键字;
  10. 涉及到分区表。

可见,使用查询的缓存的限制非常多。当使用场景中以只读为主,很少有更新的情况时,再考虑开启查询缓存。


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

599e527bec9c8547f557f0c3a2cb0f29.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 架构中,缓存是由查询缓存(Query Cache)组件来实现的。当启用了查询缓存功能时,MySQL 会将查询结果存储在缓存中,以便在后续相同查询被执行时能够直接从缓存中获取结果,而无需执行实际的查询操作。 在执行查询之前,MySQL 会检查查询语句是否存在于查询缓存中。这个检查过程包括以下几个步骤: 1. 查询语句的文本会被用作一个哈希值的计算。 2. 这个哈希值会被用来检索查询缓存中的一个缓存条目。 3. 如果存在对应的缓存条目,MySQL 会检查查询语句是否与缓存条目完全匹配(包括查询语句的文本、查询参数、数据库名等)。 4. 如果查询语句与缓存条目完全匹配,MySQL 将直接从缓存中获取结果,并将其返回给用户,而不会执行实际的查询操作。 需要注意的是,查询缓存是基于查询语句的完全匹配来进行的。即使查询语句中的某个表发生了变化,或者缓存中的数据被修改,只要查询语句完全匹配,MySQL 仍然会返回缓存中的结果。因此,在使用查询缓存时需要特别注意缓存的更新策略,以避免返回过时或不正确的结果。 值得一提的是,自 MySQL 8.0.3 版本开始,查询缓存功能已被废弃,并在后续版本中被移除。这是因为查询缓存在高并发、大数据量情况下效果不佳,容易引起性能问题。因此,建议在使用较新版本的 MySQL 时,不再依赖查询缓存功能。替代的解决方案可以是使用更高效的缓存系统,如 Memcached 或 Redis 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值