Sql查询为什么要小表驱动大表

698 阅读1分钟

分析

mysql的join实现原理是,以驱动表的数据为基础,“嵌套循环”去被驱动表匹配记录,

select * from a join b on a.bid =b.id

假设 a表10000数据,b表20数据

这里有2个过程,b 表数据最少,查询引擎优化选择b为驱动表,

  • 循环b表的20条数据,
  • 去a表的10000数据去匹配,这个匹配的过程是B+树的查找过程,比循环取数要快的多。
  1. 小表驱动的方式
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 显然小表驱动大表查询效率要高很多。