我有一个以下形式的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”部分没有帮助。
提前致谢! :)
答案 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!
的链接