Alexander
помогите плиз советом
есть коллекция, к которой обращаемся с запросом $or
согласно документации для такого запроса (если он долго выполняется) необходимо создать индекс на каждое из условий, которое указано в $or
в $or указан поиск не просто по значениям, а разные комбинации отбираемых колонок
каким образом в hint можно скормить три индекса, которые необходимо использовать?
Alexander
или стоит вообще пересмотреть подход к подобному запросу и, возможно, стоит выполнить этот запрос три раза на каждое из указанных условий в запросе?
Alexander
меня просто напрягает такая статистика во времени выполнения
"executionTimeMillis" : 658,
"totalKeysExamined" : 342702,
"totalDocsExamined" : 56,
Alexander
используется композитный индекс по 3 полям
Alexander
все 3 поля есть в запросе + выставлен хинт на использование именно этого индекса
Rustam
Всем привет. А какой true way реализовать timeline (получение данных с какого-то момента) в монге? Что я пробовал: 1. Optimistic Loop (надежно, но медленно при многопоточной записи). 2. Коллекция счетчиков (быстрее, но возможен рассинхрон при многопоточной записи). 3. Поле с CurrentDate (быстро, но возможен рассинхрон при многопоточной записи). Есть варианты получше? Надежно и быстро? ObjectId не подходит потому что нужно иногда Updat'ить данные и соответственно обновлять точку синхронизации
yopp
Alexander
Сейчас до компа дойду
yopp
yopp
Дату используй и не парься.
yopp
Серверную
yopp
Гарантировать строгий порядок в такой среде можно, но это для чата будет убийственно дорого, так как нужна координация между всеми участниками.
yopp
Потом чяты с высокой нагрузкой это всё ещё достаточно низкая частота событий, ну может быть пара сообщений в секунду.
Alexander
Пример запроса покажи?
db.orders.find({"created": { $gte: ISODate("2017-10-17T05:53:13Z") }, "channel": "smth", $or: [ { "status_external.smth" : 1, "notified.$id" : ObjectId("id") }, { "owner.$id" : ObjectId("id") }, { "performer.$id" : ObjectId("id") } ], "status_external.smth": { $nin: [8,7,9,10] } }).hint({"created": -1, "channel": 1, "status_external.smth": 1})
Alexander
пока ускорил пересобрав индекс с использованием partial и ttl
yopp
Взять и по уменьшению селективности сделать компаунд индекс
yopp
У тебя сейчас полмиллиона ключей перебирается, индексы неэффективно используются.
yopp
Нужно уменьшить выборку.
yopp
Плюс у тебя там статус два раза
Alexander
выборка продиктована бизнесом (не знаю на какой фиг так)
пока вижу только частичный + ттл
yopp
Выборку в смысле число ключей которые монга выбирает просканировать
yopp
Попробуй компануд индекс
Alexander
так у меня комаунд
Alexander
в хинте как раз поля компаунд индекса
yopp
Какое из них?
Alexander
все три
yopp
А как индекс выглядит?
Alexander
именно в такой последовательности и сортировке
Alexander
{"created": -1, "channel": 1, "status_external.smth": 1}
прямо вот так
yopp
А сколько записей в коллекции?
Alexander
миллионов 20 (возможно больше, уже не могу посмотреть)
yopp
Channel насколько уникальные значения содержит?
Alexander
4 вида значений
yopp
А статусов сколько?
Alexander
10+ значений
yopp
А в час сколько примерно записей помещается?
Alexander
🤔 примерно 2-3 тыс.
yopp
Меньше записи в секунду. Дату префиксом лучше не использовать.
yopp
Дату отдельным индексом, в компаунде оставить статус и канал.
Alexander
и без хинта?
yopp
Планировщик сам должен справиться
yopp
Хинты в основном нужны когда планировщик выбирает не тот индекс из доступный.
yopp
Тебе надо уменьшить totalKeysExamined на один два порядка.
Alexander
ага, знаний пока не хватает по этому вопросу )
спасибо, попробовать смогу уже только завтра
Alexander
сегодня еще как раз новые блоки в монго универе откроются по индексам
yopp
Лучше на два. Тысяча ключей на сотню документов — нормальный баланс
Alexander
ну пока это было достигнуто путем partial + ttl
просто за счет того, что в индексе меньше данных
yopp
Это тоже вариант, но попробуй сначала индексы в другом порядке расставить.
yopp
С другой стороны если ttl и partial подходят к задаче то и отлично.
Alexander
а компаунд индексы получается как работают?
сперва отбираются все данные по первому полю в индексе, а потом поиск сужается посредством последующих полей?
я почему-то был уверен что сразу применяется
Alexander
хотя да, именно так... и это в принципе логично (сейчас пересмотрел блок в монго универе)
yopp
yopp
Т.е. компаунд по дате в твоём случае делает тебе на первом уровне матрешек по числу уникальных дат
Alexander
ну теперь хоть понятно почему не стоит использовать дату в префиксе )
yopp
Что делает остальные уровни бесполезными
Alexander
ага, осознал
спасибо )
yopp
yopp
Даже на несколько сотен
tenni
@dd_bb https://docs.mongodb.com/manual/release-notes/3.4-changelog/#id1
чутка рано, но на днях выйдет 3.4.10
Aleksey
господа в db.currentOp()
вижу поля desc и clientMetadata можно их как то заюзать ?
Aleksey
например для указания откуда запрос пришел
Aleksey
или как это сделать веселее ? mongoengine==0.13.0
yopp
Первое вроде как в запросе настраивается, через $comment: https://docs.mongodb.com/manual/reference/operator/query/comment/
yopp
Второе фича клиента. Зависит целиком от драйвера
Aleksey
да я нашел
Aleksey
+ adult = (User.objects.filter(age__gte=18)
+ .comment('looking for an adult')
+ .first())
Aleksey
пример из примера
yopp
Ага. https://docs.mongodb.com/v3.2/reference/method/cursor.comment/
yopp
Если драйвер не умеет прямо, можешь попробовать старый addOption, может сработать.
Dmitry
Ребят, привет
Такой вопрос: роллбэк на реплике сейчас занимает 16+гб. Есть вариант его аккуратно почистить ?
yopp
посмотри что там в ролббэке, и если эти данные не нужны, то просто удали
Dmitry
Спасибо)
yopp
но вообще лучше разобраться откуда столько роллбэка
yopp
это не очень хорошо
Dmitry
Понял, спасибо)
Старый
онлайн есть кто?
yopp
Больше шансов получить ответ если сразу задать вопрос.
Старый
WiredTiger в монге сильно отличается от аэроспайковского и кассандры