MySQL查询优化:用子查询代替非主键连接查询
一对多的两张表,一般是一张表的外键关联到另一个表的主键。但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联。
例如:
BEGINDECLARE i INT;START TRANSACTION;SET i=0;WHILE i<10000 DOINSERT INTO t_team VALUES(i+1,CONCAT('team',i+1));SET i=i+1;END WHILE;SET i=0;WHILE i<1000000 DOINSERT INTO t_people VALUES(i+1,CONCAT('people',i+1),CONCAT('team',i%10000+1));SET i=i+1;END WHILE;COMMIT;END
SQL语句执行效率:
连接查询
SELECT * FROM t_team t,t_people p WHERE t.tname=p.team_nameAND p.pname='people20000' LIMIT 1;
Time:12.594 s
连接查询
SELECT * FROM t_team t INNER JOIN t_peoplep ON t.tname=p.team_name WHERE p.pname='people20000' LIMIT 1;
Time:12.360 s
子查询
SELECT * FROM (SELECT * FROM t_people WHEREpname='people20000' LIMIT 1) p, t_team t WHERE t.tname=p.team_name LIMIT 1;
Time:0.016 s
作者:叉叉哥 转载请注明出处:http://blog.csdn.net/xiao__gui/article/details/8737910