MST

星途 面试题库

面试题:MySQL查询缓存与高并发场景

在高并发读写场景下,MySQL查询缓存可能会遇到哪些问题?如何通过架构设计和配置调整,最大程度地利用查询缓存提升系统性能,同时避免潜在的性能瓶颈和数据一致性问题?
18.5万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

高并发读写场景下MySQL查询缓存可能遇到的问题

  1. 缓存失效频繁:在高并发写操作时,只要表数据发生变化,该表相关的所有查询缓存都会失效。例如电商系统中商品库存频繁更新,涉及商品表的查询缓存就会频繁失效,导致缓存命中率急剧下降。
  2. 锁争用:查询缓存使用全局锁,高并发读写时,对缓存的读操作和写操作会互相竞争锁资源。如多个用户同时读取和更新缓存,会造成锁等待,降低系统并发性能。
  3. 内存消耗:高并发场景下,大量查询缓存会占用过多内存。若内存不足,可能导致操作系统频繁进行内存交换,严重影响系统性能。

架构设计和配置调整方法

  1. 架构设计
    • 读写分离:使用主从复制架构,主库负责写操作,从库负责读操作。读操作优先走从库,减少对主库查询缓存的影响。例如在新闻发布系统中,发布新闻时主库写入,用户浏览新闻从从库读取。
    • 分布式缓存:引入 Redis 等分布式缓存作为一级缓存。先查询 Redis 缓存,未命中再查询 MySQL。例如在秒杀系统中,利用 Redis 缓存商品信息,高并发读时 Redis 承担大部分流量,减少 MySQL 查询缓存压力。
  2. 配置调整
    • 调整缓存参数:根据系统读写比例和数据变化频率,合理调整 query_cache_typequery_cache_limit 等参数。例如读多写少且数据相对稳定的系统,可适当增大 query_cache_limit 提高缓存利用率。
    • 精确控制缓存范围:通过 SQL 语句的 SQL_CACHESQL_NO_CACHE 关键字,明确哪些查询需要缓存,哪些不需要。对于数据变化频繁的查询,使用 SQL_NO_CACHE 避免无效缓存。如订单查询,因订单状态频繁变化,可使用 SQL_NO_CACHE