第一个问题:能不能使用join语句?
可以使用explain查看sql执行计划,看extra列是Index Nested-Loop Join 算法还是 Block Nested-Loop Join 算法,如果是Index Nested-Loop Join 算法,则说明语句执行过程使用到了被驱动表的索引,那么使用join时没问题的;如果是Block Nested-Loop Join算法,扫描行数就会过多,这种情况下尽量不要使用join语句。
第二个问题:如果使用join语句应该使用大表做驱动表还是小表做驱动表
应该使用小表做驱动表。这里的小表指的是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量小的那个表称之为小表。
比如t1表有100条数据,t2表有1000条数据,下面这种情况就应该使用t1做驱动表,因为t1只查b一个字段;
select t1.b,t2.* from t1 straight_join t2 on (t1.b=t2.b) where t2.id<=100;
select t1.b,t2.* from t2 straight_join t1 on (t1.b=t2.b) where t2.id<=100;
而下面这种情况就应该使用t2作为驱动表,这样join_buffer只需要放入前50条数据:
select * from t1 straight_join t2 on (t1.b=t2.b) where t2.id<=50;
select * from t2 straight_join t1 on (t1.b=t2.b) where t2.id<=50;