Предложение по улучшению индексов MongoDB

Одна из вещей, которую мы узнали из видео «Index Cardinality» [M101J: MongoDB для разработчиков Java], заключается в том, что при перемещении документа с многоключевым индексом все его индексы также должны быть обновлены, что влечет за собой значительные накладные расходы.

Я подумал, можно ли как-то обойти это ограничение. Очевидное решение состоит в том, чтобы добавить еще один уровень косвенности (это известный шаблон для решения компьютерных задач :-)) и вместо того, чтобы ссылаться на документ непосредственно из индекса, мы создаем объект для каждого документа, который ссылается на этот документ, и получаем индексы. для ссылки на этот объект, и теперь, когда мы перемещаем документ, нам нужно изменить только этот объект (объект никогда не будет перемещаться, потому что его форма BSON всегда будет одинаковой). Проблема с этим решением, конечно же, заключается в обмене места на производительность (индексы также страдают от этой проблемы).

Но вся надежда не потеряна; в MongoDB все документы имеют неизменяемое поле _id, которое автоматически индексируется. Учитывая все это, мы знаем, что если документ когда-либо будет перемещен, связанный с ним индекс _id также будет обновлен, так почему бы просто не сделать все остальные индексы ссылками на соответствующий индекс _id документа?

Учитывая это решение, единственный индекс, который будет когда-либо обновляться при перемещении документа, — это индекс _id.

Я хочу знать, может ли это решение быть реализовано в MongoDB или есть какие-то скрытые ошибки, которые сделают его непрактичным?

Спасибо


person chekkal    schedule 04.02.2014    source источник
comment
Это похоже на то, что можно опубликовать на jira.mongodb.org или в каком-то списке обсуждений монго.   -  person Dan Dascalescu    schedule 04.02.2014
comment
Разве это не требует загрузки документов BSON для проверки индекса?   -  person Sammaye    schedule 04.02.2014
comment
Это именно то, что мы делаем в TokuMX (дистрибутив MongoDB с улучшенным хранилищем), и мой коллега только что написал об этом здесь: tokutek.com/2014/02/   -  person leif    schedule 04.02.2014


Ответы (1)


Вот ответ, который я получил от «Энди Шверина», когда опубликовал тот же вопрос, что и тикет Jira: https://jira.mongodb.org/browse/SERVER-12614

Ответ Энди Шверина:

  • Это осуществимо, но при этом все операции чтения получают доступ к первичному индексу. Таким образом, если вы хотите прочитать документ, который вы нашли через вторичный индекс, вы должны взять этот _id, а затем найти его в первичном индексе, чтобы найти текущее местоположение. В зависимости от приложения это может быть хорошим компромиссом или плохим. Другие системы баз данных в прошлом использовали специальные маркеры в старом местоположении записей, иногда называемые надгробиями, чтобы указать на новые местоположения. Это позволяет вам платить за косвенность только тогда, когда документ действительно перемещается, за счет необходимости периодической очистки индексов, чтобы вы могли собирать старые надгробия.

Также спасибо leif за информативную ссылку http://www.tokutek.com/2014/02/the-effects-of-database-heap.-storage-choices-in-mongodb/ Я задал автору тот же вопрос и вот его ответ:

Ответ Зардошт Кашефф:

  • Вы могли бы, но тогда точечный запрос во вторичный индекс может привести к трем операциям ввода/вывода вместо двух. В настоящее время при любой из схем точечный запрос во вторичный индекс может потребовать ввода-вывода для получения идентификатора строки и еще одного для извлечения документа. В этой схеме вам потребуется один ввод-вывод для получения _id, другой — для получения идентификатора строки и третий — для получения документа. Это кажется нежелательным.
person chekkal    schedule 05.02.2014