MYSQL UNION 笛卡尔积
- 想必写这句
select * from tablea ,tableb where tablea.id = tableb.id
肯定有人写过无数次了吧,肯定还是有人会这样写,并且依然没有看出问题,select * from tablea,tableb
其实可以首先执行这句sql就能发现出现的结果是tablea的每个记录和table中的所有记录都生成一条记录。也就是假如tablea有四条记录,tableb有五条记录,最后会首先生成20条记录。回到开头的sql,再用where 条件去过滤内容,想必大多数人觉得也没啥问题,这个问题在数据量不大的时候,确实没啥问题,但是到了比如表A中有1w数据,表B中有1w数据,这样的会就会产生1亿的数据,然后再用where条件去过渡,可以说大大降低了性能。
- 现在我们来谈一谈 怎样避免
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
在每条union 之前的sql中加上过滤条件即可;也可以用是join on
select * from tablea join tableb on tablea.id=tableb.id
这样的话会按照on中的条件,来连接两条数据,大大减少了需要排除的数据,然后可以在where条件中再去过滤数据。