加载中…
个人资料
红兵
红兵
  • 博客等级:
  • 博客积分:0
  • 博客访问:4,164
  • 关注人气:13
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MySQL为什么在Join时用小表驱动大表

(2019-07-01 09:54:01)
分类: 数据库
MySQL 表关联的算法是 Nest Loop Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。


例: user表10000条数据,class表20条数据

select * from user u left join class c u.userid=c.userid

这样则需要用user表循环10000次才能查询出来,而如果用class表驱动user表则只需要循环20次就能查询出来。

由于MySQL使用BTREE结构,内部查询成本(3层查找or4层查找)和外部循环成本不成比例。

因此建议内表走索引,也叫INLJ,但是如果内表是二级索引,效率也低,因为要回表查主键。

如果都是全表扫描(NJL),则相差不多,成本也很高,笛卡尔积。

在有索引的情况下,MySQL会尝试去使用Index Nested-Loop Join算法,在有些情况下,可能Join的列就是没有索引,那么这时MySQL的选择Block Nested-LoopJoin。
Block Nested-Loop Join算法较Simple Nested-Loop Join的改进就在于可以减少内表的扫描次数,甚至可以和Hash Join算法一样,仅需扫描内表一次。

INLJ ==进阶==》 BKA(解决二级索引回表的问题)


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有