where子句中的SQL“OR”导致不使用索引

时间:2011-10-26 17:09:29

标签: mysql

我的查询如下:

SELECT COUNT(Table1.Identifier) AS NonCancelCnt 
FROM Table1, Table2 
LEFT JOIN eventattendees ON eventattendees.AttendeeID = 47322 
LEFT JOIN eventsignup ON eventattendees.AttendeeID = eventsignup.AttendeeID 
LEFT JOIN transactions on transactions.registrationID=eventsignup.regid 
WHERE ((eventsignup.EventID = Table1.Identifier) Or (eventsignup.EventID = Table1.AttendanceLinkID)) 

“OR”子句导致不使用索引。如果我删除任何一部分,我的执行路径从95,000到200,速度急剧增加。

我在改造这样的事情方面不是很有经验,这样做的最佳选择是什么?

3 个答案:

答案 0 :(得分:1)

首先,您应该重写查询以指定Table1,Table2和eventattende如何连接。还要选择是否要在WHERE子句中或JOIN关键字后指定要用于连接的列。稍微清理一下后,优化器可以更好地选择正确的索引来使用。

如果仍然不起作用,您可以使用SQL提示指定希望优化程序使用的索引:

WITH INDEX(IX_nameofindex)

答案 1 :(得分:0)

SELECT COUNT(Table1.Identifier) AS NonCancelCnt 
FROM Table1, Table2 
LEFT JOIN eventattendees ON eventattendees.AttendeeID = 47322 
LEFT JOIN eventsignup ON eventattendees.AttendeeID = eventsignup.AttendeeID 
LEFT JOIN transactions on transactions.registrationID=eventsignup.regid 
WHERE eventsignup.EventID = Table1.AttendanceLinkID

union all

SELECT COUNT(Table1.Identifier) AS NonCancelCnt 
FROM Table1, Table2 
LEFT JOIN eventattendees ON eventattendees.AttendeeID = 47322 
LEFT JOIN eventsignup ON eventattendees.AttendeeID = eventsignup.AttendeeID 
LEFT JOIN transactions on transactions.registrationID=eventsignup.regid 
WHERE eventsignup.EventID = Table1.Identifier

答案 2 :(得分:0)

不了解Table1和Table2是什么,也没有以任何形状连接,您将获得笛卡尔结果(对于Table1中的每条记录,将与表2中的每条记录连接)

此外,您的where子句可以使用IN子句进行简化

where
   eventsignup.EventID IN ( Table1.Identifier, Table1.AttendanceLinkID )