В MongoDB, если индекс находится на 3 полях, мы можем использовать этот индекс при запросе на 2 поля? (подстановочный знак на 3-м поле) - PullRequest
2 голосов
/ 21 сентября 2010

Если есть индекс для

page_type, our_id, date

и при запросе,

db.analytics.find({page_type: 'ingredients', ga_date: 
  {$gte : new Date('Wed Sep 08 2010 12:00:00 GMT-0800')}})

db.analytics.find({page_type: 'ingredients', ga_date: 
  {$gte : new Date('Wed Sep 08 2010 12:00:00 GMT-0800')}}).explain()

, если our_id опущен или date опущен, он все равно может использоватьindex, с чем-то вроде следующего в выводе объяснения ():

"our_id" : [
    [
        {
            "$minElement" : 1
        },
        {
            "$maxElement" : 1
        }
    ]
],

, даже если оба параметра our_id и date опущены, индекс все еще можно использовать.

Однакокогда page_type опущен, индекс не может быть использован (как показано в explain()).Так верно ли, что в MongoDB, когда часть индекса является чем-то вроде последовательности, такой как число или дата, ее можно опустить при запросе?Верно ли это и в реляционной БД, потому что я думаю, что это может быть строго по 3 полям, если этот индекс основан на этих 3 полях.

1 Ответ

1 голос
/ 21 сентября 2010

Это индексы B-дерева, поэтому их можно использовать для подмножества префиксов участвующих столбцов. Если у вас нет ведущих столбцов, сканирование диапазона индекса (операция, для которой в первую очередь используется индекс B-дерева) больше невозможно. Существуют и другие способы использования индекса (например, Oracle выполняет быстрое полное сканирование и пропускает сканирование), но обычно индекс не используется.

Это рассуждение применимо ко всему, что использует индексы B-дерева, реляционные БД или нет.

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

...