sql语句:select * from table1 t1, table2 t2, table2 t3 where t1.sid = t2.id and t1.tid = t3.id order by t1.id
这条语句把同一张表联结2次,为何查询时间呈倍数增长?
如果改成left join,速度又恢复正常:select * from table1 t1 left join table2 t2 on t1.sid = t2.id left join table2 t3 on t1.tid = t3.id where t1.ss != '' order by t1.id
奇怪的是,在不同的mysql服务里跑这个语句,执行结果也很大,比如我的机器平均查询时间在15s左右,换另一台机器在0.02秒左右。
第一种是笛卡尔积,笛卡尔积性能很差的,理论上笛卡尔积是先把三个表每条记录都组合起来,会组合爆炸,然后从组合中根据where条件去筛选符合条件的组合。所以笛卡尔积多联结一个表,查找范围理论上呈阶乘数增长,不是倍数增长。
但数据库引擎肯定会对笛卡尔积进行某种程度优化,所以查询时间不会像阶乘那么慢,不同数据库引擎优化方式和效果不一样,比如在oracle,可能笛卡尔积一般都不慢,但可能mysql会慢。