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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值