2016-07-31 2 views
1

У меня есть MongoDB колпачка коллекция со следующими показателями:естественный порядок с фильтром на MongoDB ограничена коллекция

[ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "name" : "_id_", 
     "ns" : "events.messageIn" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "uuid" : 1, 
      "ts" : -1 
     }, 
     "name" : "uuid_1_ts_-1", 
     "ns" : "events.messageIn", 
     "background" : true 
    } 
] 

Как вы можете сделать вывод, что это сбор данных о событиях. Поскольку временные метки всегда увеличиваются, заказ {$natural: -1} должен быть эквивалентным заказу {ts: -1}. Я между прочим добавил индекс по ts, чтобы быть в состоянии сделать эффективные запросы для временных срезов (например db.messageIn.find({ts: {$gte: ISODate("2016-08-01")}})

Однако, я (возможно, наивно) ожидать, что логический вопрос «дают мне самые последние сообщения SOME_UUID в» будет наиболее эффективно ответить db.messageIn.find({uuid: SOME_UUID}).sort({$natural: -1}). Как это, что запрос представляет собой набор сканирование порядков медленнее, чем план для db.event.find({uuid: SOME_UUID}).sort({ts: -1}).

Почему именно это? Спекулятивно, я предполагаю, что это потому, что MongoDB считает, что после того, как он смотрит на index, он не сможет обеспечить естественный порядок, в результате он регрессирует к сканированию коллекции. Не может ли MongoDB немного поучаствовать в этом вопросе? Например, чтобы использовать анал гия индекса книги в:

uuid  ts    page 
abcdef 2016-06-01T00:03 10 
abcdef 2016-06-01T00:02 8 
abcdef 2016-06-01T00:01 6 
ghijkl 2016-06-01T00:03 9 
mnopqr 2016-06-01T00:02 7 
mnopqr 2016-06-01T00:01 5 

После фильтрации по uuid, вы можете достаточно легко упорядочить по странице; нет необходимости посещать каждую страницу по порядку, проверять ее uuid и выводить страницу, если она соответствует. Ссылки на страницы «MongoDB» как-то не упорядочены? Понятно, что моя ментальная модель никуда не денется.

ответ

0

По моему пониманию the documentation для поддержки более высокой вместимости пропускной способности, не использующей индексы для возврата документов в порядке вставки (или в обратном порядке ввода). Следовательно, когда выполняется db.messageIn.find({uuid: SOME_UUID}).sort({$natural: -1}), каждый документ рассматривается один за другим, чтобы сохранить порядок вставки, и соответствующие документы фильтруются.

С другой стороны, db.event.find({uuid: SOME_UUID}).sort({ts: -1}) намного быстрее, потому что он использует индекс uuid_1_ts_-1 для сопоставления uuid и сортировки. В MongoDB операции сортировки могут получить порядок сортировки путем извлечения документов на основе заказа в индексе (documentation описывает случай, подобный вашему).

К слову, «uuid_1_ts_-1» не будет использоваться в запросах как db.messageIn.find({ts: {$gte: ISODate("2016-08-01")}}) как это составной индекс и индекс соединения, MongoDB может использовать только the index prefixes для поддержки запросов.

Смежные вопросы