前面我们提到了查询缓存相关的知识,你可以从两个相反的角度来使用查询缓存案例。第一个角度是你认为查询缓存效果不好,所以你关掉了
我们公司有一个数据库,用的是比较古老的 MySQL 版本。在这个版本上开启了查询缓存。但是实际上效果不太好,因为这里存储的数据其实经常变动,所以缓存命中率一直很低。我索性就关掉了这个查询缓存,后来查询性能也基本没有什么损失。
第二个角度是你赞同使用查询缓存。这里可以用两个案例来说明,第一个案例是你开启了查询缓存。
我们在业务里面有一个关键查询,这个查询比较复杂,执行的时候会非常慢。但是我注意到这个查询对应的数据是很少变动的,于是我尝试开启了查询缓存。果然开启缓存之后,这个查询大部分情况下都命中了缓存,性能得到了很大的提升。
第二个案例是你调整了查询缓存的相关参数,最为常见的是调整 query_cache_min_res_unit。这个参数的默认值是 4KB。大部分情况下,4KB 都太大了,所以会有很多内存浪费。比如说结果集可能就一行,总共不到 1KB,它都给你分配了 4KB。
我们有一个数据库是开启了查询缓存的,但是 query_cache_min_res_unit 一直使用的是默认值 4KB。后来我仔细评估了一下相关业务的查询结果集大小,4KB 显然太大了,浪费了很多内存。所以我后面把它调整成了 1KB,还是能够满足大多数查询的需求。这样就能缓存更多查询的结果集,查询性能得到了提升。
在这个角度之下,你要小心面试官问你为什么 MySQL 8.0 移除了这个功能。答案也很简单,因为缓存功能适合那种耗时并且重复执行的查询,而实际上这一类的查询并不多。 另外一个理由是,数据库本身就容易成为性能瓶颈,那么完全可以让应用自己去做缓存,减轻数据库的负担。