1. 程式人生 > >MySQL沒有實現hash join的一個猜測

MySQL沒有實現hash join的一個猜測

Hash Join的演算法本身也不算太複雜,有些人問為什麼MySQL不實現,這裡我說一下我的猜測:Hash join演算法本身不是很複雜,但要讓Hash join執行的很好,實際上需要一下完善的CBO(基本成本的代價估算)優化器。如A/B/C三張表join,A與B表join之後再與C表join時,這時走Hash join還是nestloop join, 就需要知道A與B表join之後結果集是多少,如果結果集少,直接走nestloop join,如果結果集多,可能需要走Hash join。而如果要知道A表與B表Join出多少行,就需要更詳細的統計資訊,如直方圖,而目前MySQL的優化器只是部分的CBO優化器,有一部分是RBO(基於規則 的優化器),沒有實現這些完善的CBO的功能。這樣導致讓MySQL來實現Hash join之前還需要先實現一個完善的CBO優化器,才能讓Hash join發揮價值,而這樣對MySQL修改太大了。

而又有人問,MySQL的MRR(Multi-Range Read)和BKA(Batched Key Access)功能是否能替代Hash join的功能,我的回答是完全不能。MRR功能實際上是學ORACLE的NEST LOOP,把鍵值的ROWID排序後再方便能儘量從一個塊獲取儘量多的內容,減少IO減少回表,或把原先的隨機IO轉換成順序IO的方式的優化。BKA(Batched Key Access)只是在程式訪問表的資料時,一次提供一批key值,從表中一次取出多行資料,也是減少回表的次數。這些優化小點只是對原有的演算法做了一些小點上的優化,而演算法本身還是Nest loop,所以完全不象hash jion是一種新的演算法。這種新的演算法上的改變,對效能提升是數量級上的提升,而不象小點上的優化,效能的提升不會是質的飛躍。

https://weibo.com/p/1001603899778529412913