Couchbase 5.5:为什么将 '\\' 放在 meta.id 中可以加快搜索速度?

Couchbase 5.5: Why does putting '\\' in meta.id make search faster?

沙发底座 5.5 N1Ql

我在沙盒 couchbase 数据库中有 150k 个文档,其中文档名称采用以下格式:

alpha_model::XXXXXXX::version

当我运行这个命令时:

SELECT META().id FROM Q1036628 WHERE META().id LIKE "alpha_model::100004993::%" LIMIT 10;

结果数:5。经过的时间是 1.13s

但是,当我在 '_' 之前添加 '\' 时,性能会大大提高

SELECT META().id FROM Q1036628 WHERE META().id LIKE "alpha\_model::100004993::%" LIMIT 10;

结果数:5。经过的时间是 8.16ms

为什么第二种方式快了 100 多倍?下划线不好吗?是否还有其他字符我应该转义以提高性能

_ 是匹配该位置任何字符的通配符。如果你想精确搜索,你需要转义它。在 https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/comparisonops.html

点赞

你可能在那个地方没有任何其他角色,因为你的结果是一样的。如果您在 _ 处有任何其他字符,结果将不同。

由于无法对通配符进行 IndexScan,IndexScan 对前缀字符串进行直到第一个通配符。这就是没有转义字符 IndexScan 产生更多结果并花费时间的原因。通过转义 _,通配符从 %.

开始

执行 EXPLAIN 并检查 Span 的正确性和优化。

检查第 152 页,谓词如何转换为 IndexScan 跨度 https://blog.couchbase.com/wp-content/uploads/2017/10/N1QL-A-Practical-Guide-2nd-Edition.pdf 结帐页面 341 使用请求分析优化查询。