面试题答案
一键面试缓存失效频繁问题
- 问题分析:当数据发生变化(如插入、更新、删除操作)时,相关的查询缓存会失效。如果数据库写操作频繁,就会导致缓存频繁失效,使得查询缓存的命中率降低,无法有效发挥缓存的作用。
- 优化措施:
- 合理设置缓存粒度:避免缓存过于粗粒度的查询结果。例如,如果表中有部分字段频繁更新,而其他字段很少变动,可以将查询尽量设计为只涉及很少变动字段的查询,这样即使其他字段更新,该查询缓存也不会失效。
- 读写分离:主库负责写操作,从库负责读操作。在从库上开启查询缓存,因为从库数据相对稳定,写操作少,能减少缓存失效频率,提高缓存命中率。
内存占用过大问题
- 问题分析:查询缓存将查询语句和结果都存储在内存中,如果缓存的查询结果过多或者结果本身很大,会占用大量的内存空间,可能导致系统内存不足,影响数据库及其他应用程序的性能。
- 优化措施:
- 设置合适的缓存大小:根据服务器的内存资源和业务需求,合理配置
query_cache_type
和query_cache_size
参数。可以通过监控系统内存使用情况和查询缓存命中率,逐步调整缓存大小。 - 定期清理缓存:可以使用
RESET QUERY CACHE
语句定期清理缓存,释放不再使用的内存空间。但要注意这会使所有缓存失效,所以要选择合适的清理时机,比如在业务低峰期进行。 - 过滤不必要的缓存:对于一些不常使用或者结果集很大的查询,可以通过在查询语句中添加
SQL_NO_CACHE
关键字,不将这些查询结果放入缓存,减少缓存的内存占用。
- 设置合适的缓存大小:根据服务器的内存资源和业务需求,合理配置