Как работает сортировка с индексом в MongoDB?
Мне интересно, как на самом деле работает сортировка с индексом в MongoDB. Естьпара статьи в документации MongoDB, но на самом деле они не описывают, как происходит сортировка или сложность времени. Поиски SO и межсетевого взаимодействия в целом до сих пор не выявили ничего уместного.
Давайте предположим, что естьa документы в коллекции, предложение find () соответствуетb документы, есть пределc документы возвращены,a >>b >>c, а такжеc это достаточно большое число, такое, что возвращенный набор не может поместиться в памяти - скажем, 1M документов.
В начале операции существуютb документы, которые нужно отсортировать, и отсортированный по дереву индекс размераa для функции документы будут отсортированы по.
Я могу представить:
A) пройти индекс по порядку, и для каждого ObjectID пройти списокb документы. Возвращать матчи доc достигнуто Это было бы O (аб).
B) как A), но создайте хэш-набор ObjectID вb документы в первую очередь. Это О (a), но принимает O (b) объем памяти.
Я пытался рассмотреть сортировки, основанные на прохождении множестваb документы, но не могу придумать ничего быстрее, чем O (b журналb), что не лучше, чем сортировка без индекса.
Я предполагаю (но, возможно, я ошибаюсь), что для каждой сортировки не требуется сканирование индекса, так как же эта сортировка действительно работает?
Обновить:
Ответ Кевина и предоставленная ссылка сильно сужают вопрос, но я хотел бы подтвердить / уточнить несколько моментов:
Насколько я понимаю, вы не можете использовать разные индексы для запроса и сортировки, если хотите избежать сортировки в памяти. Когда я читаюэта страница это выглядело так, как будто вы могли (или, по крайней мере, не указали так или иначе), но это кажется неправильным. По сути, документы сортируются, потому что они ищутся в порядке индекса во время запроса и поэтому возвращаются в порядке индекса. Правильно?При запросе составного индекса индекс сортировкидолжен быть первым индексом в составном индексе, за исключением индексов, где запрос равен. Если нет, сортировка выполняется в памяти. Правильно?Как сортировка работает с$in
или же$or
запросы? Например, предположим, что запрос
{a: {$in: [4, 6, 2, 1, 3, 10]}, b: {$gt: 1, $lt: 6}}
... и есть составной индекс наa
а такжеb
в этой последовательности. Как будет работать сортировка в случаях, когда сортировка включенаa
или жеb
? $or
еще сложнее, поскольку, насколько я понимаю,$or
запросы по сути делятся на несколько отдельных запросов. Являются$or
запросы всегда сортируются в памяти, по крайней мере, для объединения результатов отдельных запросов?