我的数据库中有一个事件表,其中包括start_date和end_date列。我经常运行如下查询
where start_date > 'some starting date' and end_date < 'some end date'
向start_date和end_date列添加索引是否会带来好处?我发现这不是=比较,但也许无论如何都可以。
6l7fqoea1#
MySQL优化器将在它认为合适的地方使用索引:B树索引可用于使用=、〉、〉=、〈、〈=或BETWEEN运算符的表达式中的列比较。...有时候,即使有索引可用,MySQL也不使用索引。出现这种情况的一种情况是,优化程序估计使用索引将需要MySQL访问表中很大比例的行。(在这种情况下,表扫描可能会快得多,因为它需要的查找较少。)来源:Comparison of B-Tree and Hash Indexes你可能会觉得这些很有趣:How MySQL Uses Indexes这个答案和这个Why does MySQL not use an index for a greater than comparison?的答案。
wj8zmpe12#
是的,数据库将使用这些索引,这应该会提高性能。注意:它不能同时使用两个disctinct索引,为了获得更好的性能,您需要一个multi-column index。
zf2sa74q3#
我建议使用这两个复合索引:
INDEX(start_date, end_date), INDEX(end_date, start_date)
然而,它们可能不像您希望的那样有益。这是因为没有好的方法在多个“范围”上使用索引。如果范围不重叠,则存在某种复杂的技术来使某些查询相当快:http://mysql.rjweb.org/doc.php/ipranges
3条答案
按热度按时间6l7fqoea1#
MySQL优化器将在它认为合适的地方使用索引:
B树索引可用于使用=、〉、〉=、〈、〈=或BETWEEN运算符的表达式中的列比较。
...
有时候,即使有索引可用,MySQL也不使用索引。出现这种情况的一种情况是,优化程序估计使用索引将需要MySQL访问表中很大比例的行。(在这种情况下,表扫描可能会快得多,因为它需要的查找较少。)
来源:Comparison of B-Tree and Hash Indexes
你可能会觉得这些很有趣:
How MySQL Uses Indexes
这个答案和这个Why does MySQL not use an index for a greater than comparison?的答案。
wj8zmpe12#
是的,数据库将使用这些索引,这应该会提高性能。
注意:它不能同时使用两个disctinct索引,为了获得更好的性能,您需要一个multi-column index。
zf2sa74q3#
我建议使用这两个复合索引:
然而,它们可能不像您希望的那样有益。这是因为没有好的方法在多个“范围”上使用索引。
如果范围不重叠,则存在某种复杂的技术来使某些查询相当快:http://mysql.rjweb.org/doc.php/ipranges