日期:2014-05-18  浏览次数:20722 次

SQL语句中的多个OR该如何来优化?
select   ID,SmallPic,UpTime,   BrandID   from   InfoStyle     WHERE   isShow= 'Y '       AND   Sex=2   AND   (SubClass1= '180301 '   OR   SubClass2= '180301 ')       order   by   UpTime  

现在是or影响了很大速度?现在该如何来优化呢?现在表中记录数有50万了。但是现在暂时不考虑分表。如何做呢?谢谢!希望大家都给给SQL语句方面的优化!谢谢!

------解决方案--------------------
用union all 代替
select ID,SmallPic,UpTime, BrandID from InfoStyle WHERE isShow= 'Y ' AND Sex=2 AND SubClass1= '180301 ' order by UpTime
union all
select ID,SmallPic,UpTime, BrandID from InfoStyle WHERE isShow= 'Y ' AND Sex=2 AND SubClass2= '180301 ' order by UpTime



------解决方案--------------------
使用Union All 是个比较好的方法,同意楼上的解法
------解决方案--------------------
LZ,如果要按UpTime排序的话,运行tomyuansir() ( ) 信誉:100 的方法应该会提示出错
如果你想提高你的查询效率,从你的语句上看,也优化不了什么,
在表上建立索引吧
不过你先可以这样试试看
Select * From (
select ID,SmallPic,UpTime, BrandID from InfoStyle WHERE isShow= 'Y ' AND Sex=2 AND SubClass1= '180301 '
union all
select ID,SmallPic,UpTime, BrandID from InfoStyle WHERE isShow= 'Y ' AND Sex=2 AND SubClass2= '180301 '
) T Order By UpTime
------解决方案--------------------
UNION ALL 就会比 OR 快吗,个人认为不见得。

SubClass1 和 SubClass2 加索引吧。
------解决方案--------------------
to SoftwKLC(自由的飞鸟(卢成))
注意优化去了!!
我那样子写是会报错!!
没仔细看!(*^__^*) 嘻嘻……
------解决方案--------------------
select ID,SmallPic,UpTime, BrandID from InfoStyle WHERE isShow= 'Y ' AND Sex=2 AND (SubClass1= '180301 ' OR SubClass2= '180301 ') order by UpTime
-----------------------

50万数据有什么理由慢:

ID:这个貌似标识列,不是主键就设为主键。
isShow:这个貌似当逻辑指用,改为bit类型。
------解决方案--------------------
发现的确可以提高六倍 多的速度。但是发现查询的结果却是有点出入哦。
-------------
因为你的结果没有按UpTime 排序,还会去掉重复的行
最好方法加索引吧....
------解决方案--------------------
to SoftwKLC(自由的飞鸟(卢成))
union all
不会取出重复行吧
!!
------解决方案--------------------
to SoftwKLC(自由的飞鸟(卢成))
union all
不会去除重复行吧
!!
------解决方案--------------------
tomyuansir() ( ) 信誉:100
union all
不会去除重复行吧
!!
------------------------
我是回答LZ写的那个 yua3891(大头) ( ) 信誉:100 2007-09-24 13:58:13 得分: 0 ,
它是用Union的,呵呵
------解决方案--------------------
yua3891(大头) ( ) 信誉:100 2007-09-24 14:17:02 得分: 0
SoftwKLC(自由的飞鸟(卢成兄。你刚刚写的SQL语句中的

  AND Sex =2
  AND SubClass2 = '180301 '
  )T

那个T是什么意思啊?
--------------------------
T只是个别名,你可以加任意的如,A ,B ,TT 都可以
把整个下面这部分看作T
SELECT ID, SmallPic, UpTime, BrandID
FROM InfoStyle
WHERE isShow = 'Y '
AND Sex =2
AND SubClass1 = '180301 '
UNION ALL SELECT ID, SmallPic, UpTime, BrandID
FROM InfoStyle
WHERE isShow = 'Y '
AND Sex =2
AND SubClass2 = '180301 '
------解决方案--------------------
union all不会除掉重复行,去掉重复数据就得用union