Запрос N1QL не использует ожидаемый индекс

#couchbase #n1ql

#couchbase #n1ql

Вопрос:

Я пытаюсь создать запрос couchbase N1QL, который будет использовать определенный индекс. Это мой индекс:

 CREATE INDEX index_progressTest ON testbucket(payload.type, payload.display, payload.status, meta(testbucket).id) where payload.type = "Test" AND payload.display = true AND payload.status != "IN_PROGRESS" using GSI;
  

И это мой запрос (я использую explain, чтобы увидеть, какой индекс он будет использовать):

 EXPLAIN SELECT meta(jmbucket).id FROM testbucket WHERE payload.type = "Test" AND payload.display = true AND payload.status != "IN_PROGRESS";
  

Но, похоже, что запрос не будет использовать мой индекс.
Если я удалю последнюю часть предложения «WHERE» как из индекса, так и из запроса, тогда все будет работать нормально.

Что я должен сделать, чтобы это исправить?

Спасибо!

Комментарии:

1. забыл упомянуть, что я использую couchbase 4.1.1

2. Удалите meta().id из определения вашего индекса. Он уже является частью индекса. Поэтому, добавляя его явно, вы просто сохраняете его дважды и тратите впустую пространство.

3. @Kirk Я попробую, спасибо 🙂

Ответ №1:

Это исправлено в Couchbase 4.5.

Если вы хотите использовать 4.1, удалите это из своего индекса:

 AND payload.status != "IN_PROGRESS"
  

Ответ №2:

Помните, что Couchbase чувствителен к регистру. Убедитесь, что столбцы, указанные в вашем скрипте создания индекса, соответствуют регистру элементов в документе. Я выяснил это на собственном горьком опыте. #урок усвоен