LINUX.ORG.RU

$in затупляет монговский индекс на порядок-два

 


0

3

Рано я радовался монге. На форуме надо посчитать видимые топики в разделе. Рисуем вот такой запрос:

db.forum.topics.count({ section: new ObjectId("564610a895b86c6a1c40d23f"), status: { $in:[ 1, 2 ] } })

Индекс по section + status конечно есть. Все работает полностью по индексу, только на разделе с ~10000 топиками занимает 500мс. Если вместо $in написать 2 отдельных запроса или { $lte: 2 }, то все вписывается в 10мс.

А что самое странное, по данной теме вообще ничего не нагуглилось. Кто-нибудь с подобным уже имел дело или может в джире есть зарегистрированный баг?

★★★★★

Интересное кино.

Покажи таки вывод explain, getIndexes и, если это возможно, приведи пример того, как у тебя выглядит типичный документ.

kdask
()
Ответ на: комментарий от kdask

вывод explain

Собственно, интересует, нет ли там scanAndOrder: true

kdask
()

Разрешите раскопать RDBMS обратно, товарищ хипстор!

Deleted
()
Ответ на: комментарий от kdask

Ссылка на документ выше. Вот гист с эксплейнами:

https://gist.github.com/Kirill89/bf51df7e0aebd04f494f

Там местами find вместо count, но на суть не влияет. Пробовали разные запросы и разные индексы из тех что под рукой.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

$or не правильно написан, оно ищет только st==2

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

В гисте далеко не все варианты. Поверь, если что-то можно было перепробовать, его перепробовали. Там еще есть запросы, когда надо считать статусы по диапазонам [дат/постов], но я привел самый простой пример, чтобы никого не грузить.

Проблема в отсутствии оптимизации на $in, которая ожидалась по аналогии с реляционками. Я помню, раньше $in вообще не работал. Потом дровосеки из 10gen отчитались, что осилили оптимизацию. Ну действительно, индекс использует. Но так что лучше бы совсем не работало.

Vit ★★★★★
() автор топика

Вот зачем ? Когда есть PostgreSQL ломать голову с MongoDB ? Хипстеры :)

abc
()
Ответ на: комментарий от Vit

Почему-то у меня ощущение что ты не понял что я имел ввиду. Ну да ладно.

Можно не понимать как работают составные индексы и хотеть от БД какую-то «оптимизацию $in», но если руками два запроса работают - то зачем париться?

ei-grad ★★★★★
()
Ответ на: комментарий от ei-grad

- потому что руками такое смотрится как через жопу
- потому что этот хак уже не прокатит для .skip(), когда надо пагинацию сделать.

Хинты там были потому что экспериментировали с индексами - перебирали разный порядок ключей. Убирание ни на что не влияет.

Vit ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Счетчики привернули на соплях, как выше описывал. Еще в гуглогруппу напишем.

.skip() наверное пока отложим до выяснения. На списке постов проблема не очень острая и обходится кешированием (т.к. порядок постов не меняется, а инвалидация только при удалении).

На списке тем (сортируются по обновлению), с вменяемыми усилиями кеш не построить, но можно полностью похерить пагинацию. Сделав prev/next вида /?offset=mongo_id. Единственное, что меня останавливает от выпиливания пагинации в разделах - не придумал как это представить поисковикам. Чтобы потом не долбили динамические страницы но индексировали темы.

Vit ★★★★★
() автор топика
18 марта 2016 г.

https://jira.mongodb.org/browse/SERVER-22574?filter=-2

Если кому надо - в жыре баг приняли и заредиректили на другой тикет. Но только для count. Если хотите чтобы skip + limit не сосал - репортите еще один баг.

Vit ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.