gpt4 book ai didi

sql - MySQL 复合索引和运算符 BETWEEN

转载 作者:可可西里 更新时间:2023-11-01 06:43:20 26 4
gpt4 key购买 nike

我有一个关于这个查询的问题:

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

您认为为 begin_at 和 finished_at 列创建复合索引有意义吗?还是只为 begin_at 创建索引才有意义?

最佳答案

你的风格很不寻常。

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

但是。我建议在这两个字段上都放置一个索引。

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

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

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

原因是在btrees中基本可以在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 实现松散索引,在您进行范围请求或按不同方向排序的字段上组合键变得越来越相关。

关于sql - MySQL 复合索引和运算符 BETWEEN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com