检查MySQL表中的两列是否相等是太慢了

时间:2017-02-09 13:47:30

标签: mysql

我有一个以下形式的SQL表:

| DateID | StartDate | EndDate  | a lot more columns...
|--------|-----------|----------|----------------------
|    1   |2017-02-09 |2017-02-16| ...
|    2   |2017-02-10 |   NULL   | ...
|    3   |2017-02-08 |2017-02-08| ...

我经常运行Querys:

SELECT * FROM Dates
WHERE (EndDate IS NULL AND StartDate<='some date') OR
      (StartDate=EndDate AND StartDate>='some date' AND (other conditions))

因为该表包含数千条记录,所以此查询相当慢。有没有办法加快速度?例如,使用仅包含具有相同StartDate和EndDate的日期的视图? StartDate和EndDate已经被定义为索引,但这对我猜测的“StartDate = EndDate”部分没有帮助。

提前致谢! :)

2 个答案:

答案 0 :(得分:0)

OR是你的问题。因此,MySQL不能依赖于日期索引并采取另一条(坏道路)甚至最差路径,进行全表扫描。

克服此类问题的一般解决方案是通过UNIONing几个查询来模仿OR

SELECT * FROM Dates WHERE (EndDate IS NULL AND StartDate<='some date') 
UNION ALL
SELECT * FROM Dates WHERE (StartDate=EndDate AND StartDate>='some date' AND (other conditions))

对于每个查询,MySQL都应该正确使用索引,这将大大加快总执行时间。

OR在SQL中通常是邪恶的,应尽可能避免使用。

答案 1 :(得分:0)

好的,谢谢你的帮助!我发现真正的问题甚至不是我的查询中的OR(尽管我现在使用Thomas G的建议对其进行了优化),但是在另一个使用的表中使用索引并不是那么优化在JOIN

感谢Juan Carlos Oropeza提供了MySQL indexing tips!

的链接