Couchbase 5.5 N1Ql
我在沙箱垫数据库中有15万个文档,文档名称的格式如下:
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倍?下划线不好吗?还有其他我应该逃脱的角色以提高性能
答案 0 :(得分:3)
_是通配符,用于匹配该位置的任何字符。如果要精确搜索,则需要对其进行转义。在https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/comparisonops.html
上结帐由于您的结果相同,因此您在该位置可能没有其他字符。如果您在_处还有其他字符,结果将有所不同。
由于无法对通配符执行IndexScans,因此在首个通配符之前,IndexScan会在前缀字符串上执行。这就是没有转义字符IndexScan会产生更多结果和花费时间的原因。通过转义_,通配符从%开始。
进行解释并检查跨度是否正确并进行优化。
检出页152,如何将谓词转换为IndexScan范围https://blog.couchbase.com/wp-content/uploads/2017/10/N1QL-A-Practical-Guide-2nd-Edition.pdf 检出页面341使用请求分析优化查询。