MySQL查询缓存优化

104 阅读2分钟

1、概述

开启Mysql的查询缓存,当执行完全相同的SQL语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,之前的缓存会失效,修改比较频繁的表不适合做查询缓存。

Snipaste_2024-04-23_20-23-11.png

如上图所示,MySQL首先尝试查询缓存,缓存未命中时再进行新的SQL查询流程

整体流程如下:

  1. 客户端发送一条查询给服务器;
  2. 服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶段;
  3. 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划;
  4. MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询;
  5. 将结果返回给客户端。

2、查询配置

查看当前的MySQL数据库是否支持查询缓存

SHOW VARIABLES LIKE 'have_query_cache'

查看当前MySQL是否开启了查询缓存

SHOW VARIABLES LIKE 'query_cache_type'

查看查询缓存的占用大小

SHOW VARIABLES LIKE 'query_cache_size'

查看查询缓存的状态变量

SHOW STATUS LIKE 'Qcache%'

Snipaste_2024-04-23_20-31-48.png

3、设置缓存

MySQL的查询缓存默认是关闭的,需要手动配置参数 query_cache_type , 来开启查询缓存。query_cache_type 该参数的可取值有三个

Snipaste_2024-04-23_20-32-47.png

/usr/my.cnf 配置中,增加以下配置 query_cache_type=1开启MySQL查询缓存,重启服务生效 如果是windows缓存,一般修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini文件

可以在SELECT语句中指定两个与查询缓存相关的选项 :

SQL_CACHE : 如果查询结果是可缓存的,并且 query_cache_type 系统变量的值为ON或 DEMAND ,则缓存查询结果 。

SQL_NO_CACHE : 服务器不使用查询缓存。它既不检查查询缓存,也不检查结果是否已缓存,也不缓存查询结果。

SELECT SQL_CACHE id FROM login

SELECT SQL_NO_CACHE id FROM login

4、缓存失效场景

  • 查询SQL语句不完全一致
  • 查询语句存在now()等不确定值时
  • 不使用任何表时
  • 查询mysql等数据库信息表时
  • 在存储函数、触发器等内执行时
  • 表更改时所有该表相关缓存失效