1. 背景 通常情況下,能用一條sql語句完成的查詢,我們儘量不用多次查詢完成。因為,查詢次數越多,通信開銷越大。但是,分多次查詢,有可能提高緩存命中率。到底使用一個複合查詢還是多個獨立查詢,需要根據實際情況考慮。 2. 一個場景 我們有A、B兩張表,需要做這樣的一個查詢: 當然,我們也可以拆分成兩 ...
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性能優化系列的全部鏈接:
- [MySQL性能優化系列]巧用索引 http://www.cnblogs.com/beynol/p/mysql-optimization-index.html
- [MySQL性能優化系列]LIMIT語句優化 http://www.cnblogs.com/beynol/p/mysql-optimization-limit.html
- [MySQL性能優化系列]提高緩存命中率 http://www.cnblogs.com/beynol/p/mysql-optimization-cache.html