Couchbase 5.5:为什么将 '\\' 放在 meta.id 中会使搜索更快?

Mic*_*rce 2 couchbase sql++

Couchbase 5.5 N1Ql

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

alpha_model::XXXXXXX::version
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时:

SELECT META().id FROM Q1036628 WHERE META().id LIKE "alpha_model::100004993::%" LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

vsr*_*vsr 5

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

由于结果相同,您可能在该位置没有任何其他字符。如果您在 _ 处有任何其他字符,结果将有所不同。

由于 IndexScans 不能在通配符上完成,IndexScan 在前缀字符串上完成,直到第一个通配符。这就是没有转义字符 IndexScan 产生更多结果和花费时间的原因。通过转义 _,通配符从 % 开始。

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

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