Как на самом деле работают составные индексы MongoDB? - PullRequest
0 голосов
/ 23 апреля 2019

Я создавал составные индексы в mongodb, я обнаружил странное поведение. Я создал индекс:

db.getCollection('Subject').createIndex({a:1, b:2, c:3})

он создал индекс с именем a_1_b_2_c_3.

Теперь, когда я использую команду поиска Монго:

db.getCollection('Subject').find({a:1, b:2, c:3}) //it works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({a:1, b:2}) //this also works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({a:1, c:2}) //this also works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({b:1, c:2}) //But this command doesn't uses the index `a_1_b_2_c_3`.

Может кто-нибудь дать мне знать, почему происходит такое поведение?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Это связано с индексными префиксами . Индекс {a:1, b:1, c:1} имеет префиксы { a: 1 } и { a: 1, b: 1}, поэтому запросы, содержащие фильтры в этих полях, будут использовать индекс.

Концептуально представьте индекс как B-дерево, которое начинается с фильтра на a и имеет поддеревья на b и c на более низких уровнях. Предыдущие запросы могут легко начинаться с вершины дерева и проходить вниз, тогда как последний запрос ({b:1, c:2}) не будет иметь простой отправной точки.

0 голосов
/ 07 июля 2019

Если вы все еще хотите заставить MongoDB использовать ваш индекс, вы можете подделать запрос следующим образом (я проверял его).В этом случае я предполагаю, что значения «а» в вашей коллекции являются только положительными целыми числами.

db.Subject.explain("executionStats").find({a:{$gt:-1}, b:1, c:2})

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

...