MySQL查询缓存配置、监控与清除命令详解
本文深入解析 MySQL 查询缓存的配置方法,详解 query_cache_type 参数的三种工作模式,并通过 SHOW STATUS 命令分析缓存命中情况。同时提供 FLUSH QUERY CACHE 和 FLUSH TABLES 等命令的实际应用场景,帮助你有效管理缓存空间并解决内存碎片问题。
查询缓存的作用机制
MySQL 的查询缓存(Query Cache)旨在提升重复查询的性能。当服务器接收到一个完全相同的 SQL 查询时,会直接从内存缓存中提取结果集,跳过 SQL 解析、权限检查及表扫描等步骤。这对于高并发、读写分离且更新频率极低的静态数据表尤为有效。
查询缓存的配置与验证
第1步:修改 my.cnf/my.ini 配置文件
在 [mysqld] 段落下增加以下参数。若未生效,请重启 MySQL 服务。
query_cache_size:分配给查询缓存的总内存大小,单位为字节。query_cache_type:控制缓存的行为模式。
query_cache_size=10M
query_cache_type=1
第2步:理解 query_cache_type 的三种状态
- 0 或 OFF:彻底关闭查询缓存功能。
- 1 或 ON:全局开启,但忽略带有
SQL_NO_CACHE标志的查询。
例如:SELECT SQL_NO_CACHE * FROM table_name; - 2 或 DEMAND:按需开启,仅处理带有
SQL_CACHE标志的查询。
例如:SELECT SQL_CACHE * FROM table_name;
第3步:验证环境支持性与当前状态
执行以下 SQL 语句查看变量是否已正确加载:
SHOW VARIABLES LIKE '%query_cache%';
返回结果中关注以下核心指标:
- have_query_cache:显示 YES 表示编译时已包含该特性。
- query_cache_limit:单条查询结果的最大缓存限制,超出部分将被丢弃。
- query_cache_min_res_unit:系统分配的最小块单位。设为较大值可减少小碎片,但对大数据量查询可能浪费空间。
监控缓存运行状态
使用以下命令观察缓存的动态变化:
SHOW STATUS LIKE 'qcache%';
关键状态指标解读
- Qcache_free_blocks:缓存中的相邻空闲内存块数量。数值过大表明存在严重内存碎片,建议进行整理。
- Qcache_free_memory:当前可用的空闲内存总量。
- Qcache_hits:查询命中的次数。是衡量缓存效率的最核心指标。
- Qcache_inserts:成功插入缓存的查询总数。
*命中率计算参考:(Qcache_hits / Qcache_inserts) - Qcache_lowmem_prunes:因内存不足导致旧缓存被清理的次数。若此数值持续增长,意味着分配的空间过小或碎片过多。
- Qcache_queries_in_cache:当前缓存中存储的查询条目数。
测试示例:执行两次相同查询可观察到第二次耗时显著降低(从约3.9秒降至0.0秒)。*
清除与整理缓存操作
当遇到性能波动或需要重置缓存时,可使用 FLUSH 系列命令。注意拥有 RELOAD 权限才能执行。
常用 FLUSH 选项对比
| 命令/选项 | 作用描述 | 注意事项 |
|---|---|---|
FLUSH QUERY CACHE |
整理碎片,合并相邻内存块 | 不清除已有数据,仅优化存储结构。 |
RESET QUERY CACHE |
移除所有缓存中的查询 | 不删除物理空间,类似“清空篮子”。 |
FLUSH TABLES |
关闭打开的表并清空查询缓存 | 影响当前正在执行的查询,谨慎在高峰期使用。 |
FLUSH HOSTS |
清除主机连接错误记录 | 用于解决因 IP 变更或恶意攻击导致的断连限制。 |
FLUSH PRIVILEGES |
重新加载权限表 | 通常在手动修改 mysql.user 表后必须执行。 |
风险提示:大部分 FLUSH 命令不会写入二进制日志(Binary Log),但 FLUSH LOGS 和 FLUSH SLAVE 除外。在生产环境大规模清空缓存前,请确保业务能够承受短暂的查询延迟回升。
以上就是 MySQL 查询缓存的详细内容,更多关于 MySQL 性能调优的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









