面试题答案
一键面试MySQL查询缓存的失效机制
- 表级别的失效:当对某个表执行INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE等数据修改操作时,该表相关的所有查询缓存都会失效。这是因为表数据发生了变化,之前缓存的查询结果可能不再准确。
- 结构变化:如果数据库结构发生改变,例如添加或删除索引,相关查询缓存也会失效。
高并发读写场景下优化查询缓存避免频繁失效的思路
- 合理设计缓存策略
- 区分读多写少和读写均衡场景:对于读多写少的场景,可以更多地依赖查询缓存;而读写均衡或写多读少场景,应适当降低对查询缓存的依赖。
- 按业务逻辑缓存:比如对于一些静态数据相关的查询,可以单独设置缓存规则,因为这些数据不常变化,能有效利用缓存。
- 减少不必要的写操作影响
- 批量操作:将多次小的写操作合并为一次大的批量操作。这样在一次写操作后,查询缓存只失效一次,而不是多次小操作导致多次失效。
- 使用事务:在事务内进行写操作,事务提交时才使查询缓存失效,而不是每次语句执行都导致缓存失效。
- 优化查询语句
- 避免使用不确定函数:如NOW()、RAND()等函数,因为这些函数每次执行结果可能不同,导致查询缓存无法命中。
- 确保查询的一致性:尽量使用相同的查询语句,包括空格、注释等都保持一致,这样才能提高缓存命中率。
可能涉及的参数调整
- query_cache_type
- 可以设置为0(OFF)、1(ON)、2(DEMAND)。在高并发读写场景下,如果写操作频繁,可以考虑设置为2(DEMAND),这样只有在查询语句中明确使用SQL_CACHE关键字的查询才会被缓存,减少写操作对缓存的影响。
- query_cache_limit
- 该参数限制单个查询缓存结果的最大大小。如果设置过小,可能导致一些较大结果集的查询无法缓存;设置过大,又可能浪费内存。可以根据实际业务中查询结果集的大小进行合理调整,例如如果一般查询结果集不超过1MB,可以设置为1M。
- query_cache_min_res_unit
- 这个参数定义了查询缓存分配内存块的最小单位。如果设置过大,会浪费内存;设置过小,可能导致频繁的内存分配和释放。可以通过监控内存使用情况进行调整,一般默认值是4096字节,可以根据实际情况适当减小或增大。