MySql的join操作到底是大表来驱动还是小表来驱动?

select * from t1 join t2 on (t1.a=t2.a);

t1表有100行数据,t2有1000行数据

1.假设t1的a字段和t2的a字段都有索引,此时如果以t1作为驱动表,t2作为被驱动表,那t1表全表扫描100行数据,t2表是会走索引的,所以每次扫描的次数是log2(1000),所以总的扫描次数就是100*log2(1000);相反,如果t2作为驱动表,t1作为被驱动表,则总的扫描次数为1000*log2(100),很明显第一种方案性能会更高,所以使用小表作为驱动表更好;

2.假设t1表的a字段和t2表的b字段都没有索引,此时如果以t1作为驱动表,t2作为被驱动表,那t1表全表扫描100行数据,t2表不走索引,所以每次扫描的次数是1000次,所以扫描的总次数就是100*1000,这是在内存能够存储t1所有数据的情况下,如果内存不能存储t1的所有数据时,则需要分批查处t1表的数据,然后再一次去扫描t2表的数据,此时的复杂读是:100+100*k*1000,k的取值范围是:0到1的小数;相反,如果t2作为驱动表,t1作为被驱动表,则总的扫描次数为:1000+1000*j*100,从以上分析,也能知道用小表作为驱动表性能会更好。

所以结论就是:join查询时用小表来作为驱动表性能会更好,但是需要注意的是,在项目开发中应该尽量避免连表查询,因为性能不好,对数据库资源占用过多。

你可能感兴趣的:(mysql,sql,数据库)