這篇文章主要為大家展示了“MySQL算法的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“MySQL算法的示例分析”這篇文章吧。
MySQL算法簡(jiǎn)析
在MySQL 中,只有一種Join 算法,就是大名鼎鼎的Nested Loop Join,他沒(méi)有其他很多所提供的Hash Join,也沒(méi)有Sort Merge Join。顧名思義,Nested Loop Join 實(shí)際上就是通過(guò)驅(qū)動(dòng)表的結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),然后一條一條的通過(guò)該結(jié)果集中的數(shù)據(jù)作為過(guò)濾條件到下一個(gè)表中查詢數(shù)據(jù),然后合并結(jié)果。如果還有第三個(gè)參與Join,則再通過(guò)前兩個(gè)表的Join 結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),再一次通過(guò)循環(huán)查詢條件到第三個(gè)表中查詢數(shù)據(jù),如此往復(fù)。
MySQL 目前可以通過(guò)兩種算法來(lái)實(shí)現(xiàn)數(shù)據(jù)的排序操作。
1. 取出滿足過(guò)濾條件的用于排序條件的字段以及可以直接定位到行數(shù)據(jù)的行指針信息,在SortBuffer 中進(jìn)行實(shí)際的排序操作,然后利用排好序之后的數(shù)據(jù)根據(jù)行指針信息返回表中取得客戶端請(qǐng)求的其他字段的數(shù)據(jù),再返回給客戶端;
2. 根據(jù)過(guò)濾條件一次取出排序字段以及客戶端請(qǐng)求的所有其他字段的數(shù)據(jù),并將不需要排序的字段存放在一塊內(nèi)存區(qū)域中,然后在Sort Buffer 中將排序字段和行指針信息進(jìn)行排序,最后再利用排序后的行指針與存放在內(nèi)存區(qū)域中和其他字段一起的行指針信息進(jìn)行匹配合并結(jié)果集,再按照順序返回給客戶端。
加大max_length_for_sort_data 參數(shù)的設(shè)置;
在MySQL 中,決定使用第一種老式的排序算法還是新的改進(jìn)算法的依據(jù)是通過(guò)參數(shù)max_length_for_sort_data 來(lái)決定的。當(dāng)我們所有返回字段的較大長(zhǎng)度小于這個(gè)參數(shù)值的時(shí)候,MySQL 就會(huì)選擇改進(jìn)后的排序算法,反之,則選擇老式的算法。所以,如果我們有充足的內(nèi)存讓MySQL 存放需要返回的非排序字段的時(shí)候,可以加大這個(gè)參數(shù)的值來(lái)讓MySQL 選擇使用改進(jìn)版的排序算法。
以上是“MySQL算法的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!