91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL和PostgreSQL在多表連接算法上的差異有哪些

發布時間:2021-11-01 14:11:19 來源:億速云 閱讀:188 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹MySQL和PostgreSQL在多表連接算法上的差異有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

我們知道mysql沒有hash join,也沒有merge join,所以在連接的時候只有一種算法nest loop join,nl join使用驅動表的結果集作為外表到內表中查找每一條記錄,如果有索引,就會走索引掃描,沒有索引就會全表掃。

nl join并不能適用所有場景,例如兩個表都是很大的表的等值連接,這種場景是hash join所擅長的,而且是生產環境中最常見的場景。mysql在這個時候就顯得力不從心,所以在使用mysql時我們可能會制定如下規范:禁止使用大表連接。這也是mysql永遠的痛。不過據說8.0版本已經將hash join作為一個需求納入了,我們拭目以待吧。

相比起來,postgresql的優化器十分的強勁。支持了hash join、nest loop、sort merge join,掃描算法支持seq scan、index scan、index only scan,同時還支持堆內元組技術(HOT)。在postgresql11版本中還加入了并行掃描,親測在兩張大表(一張1.6億一張256萬數據,均無索引)做join結果集300多萬,pg開啟并行大概20s以內就跑出結果,強于其他數據庫。

上面討論了兩表join的算法,下面看看多表join時mysql和pg是如何處理的。多表join其實涉及到一個問題:如何找到代價最小的最優路徑。為什么會有這個問題呢?因為在多表連接時,每兩個表之間連接具有一個代價值,優化器會根據代價估算調整不同表join的順序,最后算出一個最優或者近似最優代價,使用這個代價生成執行計劃,這樣就涉及到圖論中的最短路徑問題,不同的連接順序組合代表了圖的遍歷,最優代價其實就是求無源圖的最短路徑問題。我們知道兩種主流的最短路徑算法是迪杰斯特拉(Dijkstra)算法和弗洛伊德(floyd)算法,這兩種算法也是動態規劃中的經典算法。

在mysql中計算最優代價使用貪心算法,而pg使用的是動態規劃。

Mysql:

Mysql連接使用貪心算法,下面這個圖表明了貪心算法的過程:

MySQL和PostgreSQL在多表連接算法上的差異有哪些 

貪心算法的前提是確定源點,算法思想也和名字很像,只找當前步驟的最優解,是一種深度優先的解法,算法復雜度是O(n2)找到后繼續深入下一層,直至達到終點。比如上圖從A到G,使用貪心算法的路徑是A->B->D->G算法,代價是1+2+6=9,很明顯這并不是最優解,最優解我們肉眼可以看出來是A->C->F->G,代價是2+3+1=6。所以我們看貪心算法并不是全局最優的,但是優點是算法復雜度低,mysql可能也是基于這種考慮而使用貪心算法,不想將時間都浪費在計算代價上了,因為如果關聯的表特別多,那么代價的計算是指數級增長,所以貪心算法雖然不是最優解,但是在連接表的數量很大的情況下具有一定優勢。

Postgresql:

再來看看pg使用的動態規劃,動態規劃解決的是無源最短路徑問題,我們想象一下其實多表連接本身就是一個無源最短路徑問題,只是mysql在進行連接的時候隨機選了一個作為起點而已。

動態規劃的思想是將問題分解為子問題,將問題遞推為子問題進行解決。以floyd算法為例。算法使用鄰接矩陣來表示每個點之間的距離,如果沒有連線,則代表無窮大。比如下面這個圖:

MySQL和PostgreSQL在多表連接算法上的差異有哪些

 

弗洛伊德算法使用矩陣記錄節點直接距離,它的強大之處在于它經過若干次計算后得到任意兩個節點直接的最短距離,是真正意義上的無源最短路徑算法,但是它的算法復雜度也比較高,是O(n3)。下面介紹一下該算法,算法的核心思想是如果a[ij]>a[ik]+a[kj],那么a[ij]=a[ik]+a[kj],對于每兩個節點ab之間的距離,如果存在第三個中間節點c使得acb的距離更短,那么ab的距離使用acb代替,并更新到矩陣。這樣的遍歷過程我們大致就理解了需要三層循環,里面的兩層循環是對于ab、ac、ad...de總共(n-1)*(n-1)種選擇(自己對自己的距離不用計算)計算每個中間節點(最外層循環)的距離是否更小。矩陣計算過程如下:

MySQL和PostgreSQL在多表連接算法上的差異有哪些

對于第一行,依次計算ab,ac,ad,ae的距離是否有第三個節點進行替換,對于ab計算發現,ab<ac+cb&&ab<ad+db&&ab<ae+eb,所以ab不用更新,同理ac也不用更新,對于ad,計算得到ab+bd=6,ac+cd=∞,ae+ed=∞,于是更新ad=6,同理計算更新ae=8;然后依次計算下面幾行。全部遍歷完,經歷了三層循環,算法復雜度是O(n3)。pg使用該算法能夠得到最優執行計劃,但是在表的個數很多時計算代價所付出的代價也很大。

以上是“MySQL和PostgreSQL在多表連接算法上的差異有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辉县市| 白朗县| 垦利县| 顺昌县| 铜梁县| 定结县| 瑞昌市| 平遥县| 南城县| 长阳| 闽清县| 沙雅县| 建宁县| 黄龙县| 桐城市| 宁远县| 延安市| 古田县| 巴东县| 于田县| 靖边县| 台安县| 阿拉善右旗| 大名县| 北安市| 溧阳市| 慈溪市| 新巴尔虎右旗| 长寿区| 新建县| 四子王旗| 二连浩特市| 三江| 苍梧县| 公主岭市| 东乡| 洪湖市| 固阳县| 璧山县| 绍兴市| 合川市|