MySQL 复合索引和运算符 BETWEEN

2024-03-18

我对这个查询有一个疑问:

SELECT * 
  FROM runs 
 WHERE (NOW() BETWEEN began_at 
                  AND finished_at)

您认为为 begin_at 和 finish_at 列创建复合索引有意义吗? 或者只为 begin_at 创建索引才有意义?


你的风格很不寻常。

大多数人可能会写WHERE began_at < NOW() AND finished_at > NOW()

然而。我建议在这两个字段上都建立索引。

组合键对您没有用,因为它只会加快特定日期组合的搜索速度。

嗯,这并不完全正确,因为如果您使用 betree,组合键会对您有所帮助,但不如单独索引它们那么好。 如果您使用等号 (=) 运算符搜索字段组合,则组合键非常有用。单字段索引在 ragen 请求中表现更好。

你可以用谷歌搜索一下“多维范围搜索”。

原因是在btree中基本上可以在log(n)时间内找到一个字段中的所有匹配字段。 所以你的总运行时间将是 O(k*log(n)),即 O(log(n))。

多维范围查询的运行时间为 O(sqrt(n)),更高。然而,还有更好的实现,也可以实现对数运行时间。 然而它们并没有在 mysql 中完全实现,所以根据版本的不同,它们会更糟或更糟糕。

那么让我总结一下:

  • 单个字段的相等比较:哈希索引(运行时 O(1))

  • 单个字段的范围搜索:单个字段的 btree 索引 ( O(log(n)) )

  • 多个字段上的相等搜索:组合哈希键(运行时 O(1))

这些案例是很清楚的事情......

  • 多个字段的范围搜索:单独的 btree 索引 ( O(log(n)) )

这是不太清楚的地方。由于上述原因,对于当前版本,单独索引显然更好。 通过该用例的完美实现,您可以使用组合键获得更好的性能,但没有系统知道哪个支持它。 mysql 从 5.0 版本开始支持松散索引(您需要它),但非常有限,并且查询优化器仅在极少数情况下使用它们。不知道像5.3之类的新版本。

然而,随着 mysql 实现松散索引,在您执行范围请求或按不同方向排序的字段上组合键变得越来越相关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 复合索引和运算符 BETWEEN 的相关文章

随机推荐