Couchbase 5.5: почему размещение метаданных в метаданных ускоряет поиск? - PullRequest
0 голосов
/ 18 февраля 2019

Couchbase 5.5 N1Ql

У меня есть 150 тыс. Документов в базе данных couchbase для песочницы, в которой имя документа имеет следующий формат:

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 раз быстрее?Подчеркивания плохие?Есть ли другие персонажи, которых я должен сбежать, чтобы улучшить производительность

1 Ответ

0 голосов
/ 19 февраля 2019

_ - это подстановочный знак, соответствующий любому символу в этом месте.Если вы хотите найти именно то, что вам нужно, вам нужно избежать этого.Оформить заказ LIKE на https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/comparisonops.html

Возможно, у вас нет другого персонажа в этом месте, потому что ваши результаты совпадают.Если у вас есть какой-либо другой символ в _, результаты будут другими.

Поскольку IndexScan не может быть выполнен с подстановочными знаками, IndexScan выполняется на строке префикса до первого подстановочного знака.Это причина без побега персонажа IndexScan, который дает больше результатов и занимает много времени.После экранирования _ подстановочный знак начинается с%.

Выполните EXPLAIN и извлеките Spans на предмет корректности и оптимизации.

Checkout Page 152, Как предикат преобразуется в диапазоны IndexScan https://blog.couchbase.com/wp-content/uploads/2017/10/N1QL-A-Practical-Guide-2nd-Edition.pdf Оформить заказ Оптимизировать запрос, используя профилирование запроса.

...