我的数据库中有一个事件表,其中包括start_date和end_date列。
我经常运行像
这样的查询where start_date > 'some starting date' and end_date < 'some end date'
我是否可以从start_date和end_date列添加索引中获益?我发现这不是一个=比较,但无论如何也许。
答案 0 :(得分:14)
MySQL优化器将使用它认为合适的索引:
B树索引可用于表达式中的列比较 使用=,&gt;,&gt; =,&lt;,&lt; =或BETWEEN运算符。
...
有时MySQL不使用索引,即使有索引也是如此。一 发生这种情况的情况是优化程序估计的时间 使用索引需要MySQL访问非常大的 表中行的百分比。 (在这种情况下,表扫描是 可能要快得多,因为它需要较少的搜索。)
来源:Comparison of B-Tree and Hash Indexes
你可能会发现这些有趣:
this answer和this answer到Why does MySQL not use an index for a greater than comparison?。
答案 1 :(得分:1)
是的,数据库将使用这些索引,它应该提高性能。
注意:它不能同时使用两个不同的索引以获得良好的性能,您需要multi-column index。
答案 2 :(得分:-3)
根据我的经验,索引通常不会用于大于/小于条件,因为范围是开放式的,因此对于具有n行的表将有O(n)匹配行。
但是,一般 do 之间使用索引,因为范围有限,所以会有O(1)个匹配的行,所以你可以使用这个技巧:
where start_date between 'some starting date' and 'some end date'
and end_date beween 'some starting date' and 'some end date'
由于结束日期不能早于开始日期,因此这些比较仍然有意义。