《Mysql必讀mysql分解關(guān)聯(lián)查詢的優(yōu)點(diǎn)》要點(diǎn):
本文介紹了Mysql必讀mysql分解關(guān)聯(lián)查詢的優(yōu)點(diǎn),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
導(dǎo)讀:很多高性能的應(yīng)用都會(huì)對(duì)關(guān)聯(lián)查詢進(jìn)行分解.簡(jiǎn)單的說,可以對(duì)每一個(gè)表進(jìn)行一次單表查詢,然后將結(jié)果在應(yīng)用程序中進(jìn)行關(guān)聯(lián).
很多高性能的應(yīng)用都會(huì)對(duì)關(guān)聯(lián)查詢進(jìn)行分解.簡(jiǎn)單的說,可以對(duì)每一個(gè)表進(jìn)行一次單表查詢,然后將結(jié)果在應(yīng)用程序中進(jìn)行關(guān)聯(lián).
例如下面這個(gè)查詢
- 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);?
到底為什么要這樣做?乍一看,這樣做并沒有什么好處,原本一條查詢,這里變成多條查詢,返回的結(jié)果又是一模一樣的.事實(shí)上,用分解關(guān)聯(lián)查詢的方式重構(gòu)查詢有如下優(yōu)勢(shì):
(1)讓緩存的效率更高.許多應(yīng)用程序可以方便的緩存單表查詢對(duì)應(yīng)的結(jié)果對(duì)象.例如,上面查詢中的tag已經(jīng)被緩存了,那么應(yīng)用就可以跳過第一個(gè)查詢.再例如,應(yīng)用中已經(jīng)緩存了ID為123、789的內(nèi)容,那么第三個(gè)查詢的in()
中就可以少幾個(gè)ID.另外,對(duì)mysql的緩存來說,如果關(guān)聯(lián)中的摸個(gè)表發(fā)生了變化,那么久無法使用查詢緩存了,而拆分后,如果摸個(gè)表很少改變,那么基于該表的查詢就可以重復(fù)利用查詢緩存結(jié)果了
(2)將查詢分解后,執(zhí)行單個(gè)查詢可以減少鎖的競(jìng)爭(zhēng).
(3)在應(yīng)用層做關(guān)聯(lián),可以更容易對(duì)數(shù)據(jù)庫進(jìn)行拆分,更容易做到高性能和可擴(kuò)展.
(4)查詢本身效率也可能會(huì)有所提升.這個(gè)例子中,使用in()代替關(guān)聯(lián)查詢,可以讓msyql按照ID順序進(jìn)行查詢,這可能比隨機(jī)的關(guān)聯(lián)要更高效.
(5)可以減少冗余記錄的查詢.在應(yīng)用層做關(guān)聯(lián)查詢,意味著對(duì)應(yīng)某條記錄應(yīng)用只需要查詢一次,而在數(shù)據(jù)庫中做關(guān)聯(lián)查詢,則可能需要重復(fù)的訪問一部分?jǐn)?shù)據(jù).從這點(diǎn)看,這樣的重構(gòu)還可能會(huì)減少網(wǎng)絡(luò)和內(nèi)存的消耗.
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/5726.html