《Mysql必讀mysql分解關聯查詢的優點》要點:
本文介紹了Mysql必讀mysql分解關聯查詢的優點,希望對您有用。如果有疑問,可以聯系我們。
導讀:很多高性能的應用都會對關聯查詢進行分解.簡單的說,可以對每一個表進行一次單表查詢,然后將結果在應用程序中進行關聯.
很多高性能的應用都會對關聯查詢進行分解.簡單的說,可以對每一個表進行一次單表查詢,然后將結果在應用程序中進行關聯.
例如下面這個查詢
- select?*?from?tag??
- ??????join?tag_post?on?tag_post.tag_id=tag.id?
- ??????join?post?on?tag_post.post_id=post.id?
- ??????where?tag.tag='mysql'?
可以分解成下面這些查詢來代替
- select?*?from?tag?where?tag='mysql';?
- ?
- select?*?from?tag_post?where?tag_id?=?1234;?
- ?
- select?*?from?post?where?post.id?in?(123,456,789,369);?
到底為什么要這樣做?乍一看,這樣做并沒有什么好處,原本一條查詢,這里變成多條查詢,返回的結果又是一模一樣的.事實上,用分解關聯查詢的方式重構查詢有如下優勢:
(1)讓緩存的效率更高.許多應用程序可以方便的緩存單表查詢對應的結果對象.例如,上面查詢中的tag已經被緩存了,那么應用就可以跳過第一個查詢.再例如,應用中已經緩存了ID為123、789的內容,那么第三個查詢的in()
中就可以少幾個ID.另外,對mysql的緩存來說,如果關聯中的摸個表發生了變化,那么久無法使用查詢緩存了,而拆分后,如果摸個表很少改變,那么基于該表的查詢就可以重復利用查詢緩存結果了
(2)將查詢分解后,執行單個查詢可以減少鎖的競爭.
(3)在應用層做關聯,可以更容易對數據庫進行拆分,更容易做到高性能和可擴展.
(4)查詢本身效率也可能會有所提升.這個例子中,使用in()代替關聯查詢,可以讓msyql按照ID順序進行查詢,這可能比隨機的關聯要更高效.
(5)可以減少冗余記錄的查詢.在應用層做關聯查詢,意味著對應某條記錄應用只需要查詢一次,而在數據庫中做關聯查詢,則可能需要重復的訪問一部分數據.從這點看,這樣的重構還可能會減少網絡和內存的消耗.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/5726.html