許多高性能的站點都用了“分解連接”技術,也就是把單個多表連接查詢改成多個但表查詢,然後在程序中合並數據,比如:
select a.*,b.* from A a join B b on a.id = b.id
可以替換為:
select a.* from A;
select b.* from B;
然後再把數據通過程序合並。
可能有些人認為這太浪費了,把一個查詢語句變成兩條查詢語句或者更多的查詢語句了,如果哪位猿類這樣想了,那你就應該繼續往下看了。
將連接查詢重構為多表查詢,總體有以下性能優勢:
一,緩存的效率更高。許多應用程序都直接緩存了表。
二,對MyISAM表來說,每個表查詢可以更有效的利用表鎖,因為查詢會鎖住單個表較短時間,而不是把所有表長時間鎖住。
三,在程序端應用連接,可以更方便的擴展數據庫,把不同的表放在不同的服務器上面。
四,查詢本身會更高效
五,可以減少多余的行訪問。在應用程序端進行連接意味著每行數據只會訪問一次,而連接從本質上來說是非正則化的,它會反復的訪問同一行數據。基於同樣的原因,這種重構方式可以減少網絡流量和內存消耗。
那在什麼時候在應用程序端進行連接效率更高呢?
一,可以緩存早期查詢的大量數據
二,使用了多個MyISAM表
三,數據分布在不用的服務器上
四,對於大表,使用in()替換連接
五,一個連接引用了同一個表很多次