`
winhack
  • 浏览: 42538 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

union、in、or查询效率及index

阅读更多

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 只成倍增加表扫描的次数。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics