[MySQL性能优化系列]提高缓存命中率

1. 背景

通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成。因为,查询次数越多,通信开销越大。但是,分多次查询,有可能提高缓存命中率。到底使用一个复合查询还是多个独立查询,需要根据实际情况考虑。

2. 一个场景

我们有A、B两张表,需要做这样的一个查询:

SELECT a1, a2,
(SELECT b1, b2 FROM B WHERE B.b3 = A.a1)
FROM A WHERE A.a3 = ?

当然,我们也可以拆分成两次查询:

SELECT a1, a2 FROM A WHERE A.a3 = ? # 查询1
SELECT b1, b2 FROM B WHERE B.b3 = ? # 查询2,查询参数从查询1返回的结果中取得

实际运行中,我们发现,拆分后,系统的整体性能有了提升。

原因是,复合查询中,"where A.a3 = ?"处的查询参数很少重复出现,导致缓存很少命中。

而拆分后,虽然查询1的缓存依然很少命中,但是查询2中"WHERE B.b3 = ?"处的查询参数经常重复出现,缓存命中率很高。

总而言之,MySQL的缓存是基于整个SQL语句的,只要SQL语句中任何一点发生变化,那么整个语句就不会被缓存。复杂的语句,重复出现的概率可能很低。所以,适当的拆分,有可能提高整体的缓存命中率。

最后,附上MySQL性能优化系列的全部链接:

上一篇:Scrum三大角色特点


下一篇:MySQL性能优化:索引