Ale*_*kin 6 mysql sql indexing composite between
我对此查询有疑问:
SELECT *
FROM runs
WHERE (NOW() BETWEEN began_at
AND finished_at)
Run Code Online (Sandbox Code Playgroud)
你认为为beginning_at和finished_at列创建复合索引是否有意义?或者只为starts_at创建索引是有意义的?
你的风格非常罕见.
大多数人可能会写 WHERE began_at < NOW() AND finished_at > NOW()
然而.我建议在这两个字段上添加一个索引.
组合键不会对您有用,因为它只会加速搜索器的特定日期组合.
嗯,这并不完全正确,因为如果你使用betree,一个组合键可以帮助你,但不如你单独索引它们一样好.如果使用等号(=)运算符搜索字段组合,则组合键非常好.单元字段索引在ragen请求中表现更好.
您可以谷歌搜索"多维范围搜索".
原因是一个字段中的所有匹配字段基本上可以在btree中的log(n)时间中找到.因此,您的整体运行时将为O(k*log(n)),即O(log(n)).
多维范围查询的运行时间O(sqrt(n))更高.然而,也有更好的实现,也是acheav对数运行时.但是它们并没有在mysql中完全实现,因此根据版本的不同,它会更糟或更糟糕.
所以让我总结一下:
单个字段的等式比较:哈希索引(运行时O(1))
单个字段的范围搜索:单个字段上的btree索引(O(log(n)))
在多个字段上进行平等搜索:组合哈希键(运行时O(1))
那些案子是明确的......
这是不太清楚的地方.由于上面给出的原因,对于当前版本,它明显更好地单独索引.通过对该用例的完美实现,您可以使用组合键获得更好的性能,但是没有系统知道它支持它.从版本5.0开始,mysql支持松散索引(你需要它),但只是非常有限,而查询优化器仅在极少数情况下才使用它们.不知道5.3等新版本.
但是,如果使用mysql实现松散索引,则在字段上组合键可以进行范围请求或在不同方向上进行排序变得越来越相关.