mysql 用多次查詢代替一次復雜join查詢的優點分析


詳見:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt344

 

多高性能的應用都會對關聯查詢進行分解。簡單地,可以對每一個表進行一次單表查詢,然后將結果在應用程序中進行關聯。例如,下面這個查詢:

blob.png

可以分解為下面這些查詢來代替:

blob.png

到底為什么要這樣做?乍一看,這樣做並沒有什么好處,原本一條查詢,這里卻變成多條查詢,返回的結果又是一模一樣的。事實上,用分解關聯查詢的方式重構查詢有如下的優勢:

 

•讓緩存的效率更高。許多應用程序可以方便地緩存單表查詢對應的結果對象。例如,上面查詢中的tag已經被緩存了,那么應用就可以跳過第一個查詢。再例如,應用中已經緩存了ID為123、567、9098的內容,那么第三個查詢的IN()中就可以少幾個ID。另外,對MySQL的查詢緩存來說注6,如果關聯中的某個表發生了變化,那么就無法使用查詢緩存了,而拆分后,如果某個表很少改變,那么基於該表的查詢就可以重復利用查詢緩存結果了。

•將查詢分解后,執行單個查詢可以減少鎖的競爭。

•在應用層做關聯,可以更容易對數據庫進行拆分,更容易做到高性能和可擴展。

•查詢本身效率也可能會有所提升。這個例子中,使用IN()代替關聯查詢,可以讓MySQL按照ID順序進行查詢,這可能比隨機的關聯要更高效。我們后續將詳細介紹這點。

•可以減少冗余記錄的查詢。在應用層做關聯查詢,意味着對於某條記錄應用只需要查詢一次,而在數據庫中做關聯查詢,則可能需要重復地訪問一部分數據。從這點看,這樣的重構還可能會減少網絡和內存的消艷。

•更進一步,這樣做相當於在應用中實現了哈希關聯,而不是使用MySQL的嵌套循環關聯。某些場景哈希關聯的效率要高很多。

在很多場景下,通過重構查詢將關聯放到應用程序中將會更加高效,這樣的場景有很多,比如:當應用能夠方便地緩存單個查詢的結果的時候、當可以將數據分布到不同的MySQL服務器上的時候、當能夠使用IN()的方式代替關聯查詢的時候、當查詢中使用同一個數據表的時候。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM