SQL join查询为什么要小表驱动大表?
分析
mysql的join实现原理是,以驱动表的数据为基础,“嵌套循环”去被驱动表匹配记录,
select * from a join b on a.bid =b.id
假设 a表10000数据,b表20数据
这里有2个过程,b 表数据最少,查询引擎优化选择b为驱动表,
- 循环b表的20条数据,
- 去a表的10000数据去匹配,这个匹配的过程是B+树的查找过程,比循环取数要快的多。
- 小表驱动的方式
for 20条数据 匹配10000数据(根据on a.bid=b.id的连接条件,进行B+树查找)
查找次数 20+ log10000
如果使用大表驱动,则查找过程是这样的
for 10000条数据 匹配20条数据(根据on a.bid=b.id的连接条件,进行B+树查找)
查找次数 10000+ log20
结论
可以看出来
小表驱动大表:20+ log10000
大表驱动小表:10000+ log20
显然小表驱动大表查询效率要高很多。