union 用于合并两个或多个查询结果,这些查询结果必须具备相同的列结构、相同的列顺序。
union:
select column_names from tablename
union
select column_names from tablename
union all:
select column_names from tablename
union all
select column_names from tablename
union与union all的区别在于UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
SQL在运行时先取出两个表的结果,再用排序空间进行排序并会掉删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
而union all只是简单的将两个结果合并后就返回,这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,union all比union会快很多,如果确定两个表中不包含重复数据的话就用union all。
有些时候会不可避免的用到in与or进行查询。但使用时需要注意使用in或or查询会进行数据遍历,会影响查询效率。
SQL:
SELECT * FROM article WHERE article_category=11 ORDER BY article_id DESC LIMIT 5
优化此sql效率,建立索引:
create index idx_u on article (article_category,article_id);
in:
SELECT * FROM article WHERE article_category IN (2,3) ORDER BY article_id DESC LIMIT 5
or:
select * from article where article_category=2 or article_category=3 order by article_id desc limit 5
此时已经做了列索引但查询效率依旧不高。
union all:
(select * from article where article_category=2 order by article_id desc limit 5)
UNION ALL (select * from article where article_category=3 order by article_id desc limit 5)
ORDER BY article_id desc
limit 5
1.对于索引列来最好使用union all,因复杂的查询【包含运算等】将使or、in放弃索引而全表扫描,除非你能确定or、in会使用索引。
2.对于只有非索引字段来说你就老老实实的用or 或者in,因为 非索引字段本来要全表扫描而union all 只成倍增加表扫描的次数。