Viktor
Я имел ввиду вложенный массив
Viktor
Как вы показали в общем
Viktor
Тогда индекс примерно будет таким {access: 1, name: 1, bid: 1}
Sergey
Какие-то странные проблемы на 100к записей
Viktor
Какие-то странные проблемы на 100к записей
Если долбят постоянно коллекцию COLLSCAN'ами, то неудивительно
Oleg
Тогда индекс примерно будет таким {access: 1, name: 1, bid: 1}
Если запрос без bid, то будет тоже он работать?
Viktor
Это index prefixing называется
Sergey
Только тогда и запрос с bid надо менять, чтобы в запросе bid был последним
Sergey
Не факт
Viktor
Нужно просто удостовериться потом при помощи explain
Viktor
А это тоже влияет?
Зависит от версии монги, я думаю
Viktor
Но это простой запрос, чтобы планировщик понял
Nick
эм
Nick
заморочился
Nick
).find({ "$or":[ {"owner_id" : 123, "bid":2321312}, {"admins.id" : 123, "bid":2321312} ] })
Nick
"winningPlan" : { "stage" : "SUBPLAN", "inputStage" : { "stage" : "FETCH", "inputStage" : { "stage" : "OR", "inputStages" : [ { "stage" : "IXSCAN", "keyPattern" : { "owner_id" : 1, "bid" : 1 }, "indexName" : "owner_id_1_bid_1", "isMultiKey" : false, "multiKeyPaths" : { "owner_id" : [], "bid" : [] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "owner_id" : [ "[123.0, 123.0]" ], "bid" : [ "[2321312.0, 2321312.0]" ] } }, { "stage" : "IXSCAN", "keyPattern" : { "admins.id" : 1, "bid" : 1 }, "indexName" : "admins.id_1_bid_1", "isMultiKey" : false, "multiKeyPaths" : { "admins.id" : [], "bid" : [] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "admins.id" : [ "[123.0, 123.0]" ], "bid" : [ "[2321312.0, 2321312.0]" ] } } ] } } },
Nick
как видно индексы юзаются
Sergey
Я не раз сталкивался, что обычный and по двум полям сваливался в colscan, если порядок полей не соответствовал индексу. По-моему этот случай даже в документации по pymongo описан при передаче dict-a, который не сортмрованный
Nick
Эксплейн https://pastebin.com/uvMDPsYb
Viktor
как видно индексы юзаются
Добавь сортировку теперь
Nick
"winningPlan" : { "stage" : "SUBPLAN", "inputStage" : { "stage" : "SORT", "sortPattern" : { "name" : 1.0 }, "inputStage" : { "stage" : "SORT_KEY_GENERATOR", "inputStage" : { "stage" : "FETCH", "inputStage" : { "stage" : "OR", "inputStages" : [ { "stage" : "IXSCAN", "keyPattern" : { "owner_id" : 1, "bid" : 1 }, "indexName" : "owner_id_1_bid_1", "isMultiKey" : false, "multiKeyPaths" : { "owner_id" : [], "bid" : [] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "owner_id" : [ "[123.0, 123.0]" ], "bid" : [ "[2321312.0, 2321312.0]" ] } }, { "stage" : "IXSCAN", "keyPattern" : { "admins.id" : 1, "bid" : 1 }, "indexName" : "admins.id_1_bid_1", "isMultiKey" : false, "multiKeyPaths" : { "admins.id" : [], "bid" : [] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "admins.id" : [ "[123.0, 123.0]" ], "bid" : [ "[2321312.0, 2321312.0]" ] } } ] } } } }
Nick
db.getCollection('tst').find({ "$or":[ {"owner_id" : 123, "bid":2321312}, {"admins.id" : 123, "bid":2321312} ] }).sort({name:1}).explain()
Nick
индексы те же что и в пастебине
Oleg
Итого? :)
Nick
итого тебе нужно переписать азпрос
Nick
и построить два инедкса
Oleg
Удаление индексов блокируют коллекцию?
Nick
добавление name к индксам, чуток меняет план на использование SORT_MERGE
Nick
если с ключом background:true то нет
Nick
момент
Oleg
если с ключом background:true то нет
При удалении такого нет вроде.
Nick
упс, проглядел что вопрсо пр оудаление
Viktor
Итого получаем сортировку в памяти
Nick
там нет никак пробелм
Nick
Индексы: Для овнера: { "owner_id" : 1, "bid" : 1, "name" : 1 } Для админов: { "admins.id" : 1, "bid" : 1, "name" : 1 } Фильтр для запросов: {"$or":[ {"owner_id" : 123, "bid":2321312}, {"admins.id" : 123, "bid":2321312} ]}
Viktor
это плохо?
Лишний расход cpu/ram
Viktor
Итого это лучший вариант?
Это лучший вариант по скорости выборки
Nick
Лишний расход cpu/ram
лишний расход на базе в 100к? смешно
Oleg
лишний расход на базе в 100к? смешно
там есть другие базы с 50 млн. и 3 млн запросами в сутки
Oleg
Вы хотите об этом поговорить?)))
Об этом чуть позже. Next step. :)
Nick
Как попробуете отпишистесь о результатах
Oleg
Так как удалить индексы не вырубить приложение?
Nick
просто дропай и все
Nick
удаление только замедлит запросы, котоыре их использовали
Nick
а вот создание новых желательно в бекграунде, а то будет полноценный лок коллекции
Sergey
В идеале - по одной реплике переключать на новые индексы
Sergey
Но 100к - это мало, даже не в бекграунде построение индекса займёт несколько единиц секунд
Sergey
Хотя, в последних версиях вроде background-индексы не лочат слейвы
Viktor
Ребят, прошел курсы по монге, получил на почту от них вот такое: Become a MongoDB teaching assistant. We are looking to hire teaching assistants for future courses. As a top performer, you may qualify for this paid position. To apply, fill out this form and we will contact you if there is an opportunity. Кто-нибудь участвовал в этом деле?
yopp
поучавствуешь — расскажи
Ilya
всем привет, тут глупые вопросы по монге задавать можно?
yopp
можно
Ilya
есть примерно такая коллекция: { _id: 1, name: "name1" prop: [ { key: "key1", value: 75}, { key: "key2", value: 78 }, { key: "key3", value: 70 } ] } приходит список новых свойств вида prop: [ { key: "key1", value: 90}, { key: "key4", value: 78 } ] то есть одно свойство изменилось и одно добавилось - как седлать обновление объекта в монге?
yopp
двумя запросами, в одном $elemMatch и $set с $, а второй просто $push
Ilya
ок, просто в один запрос я тоже так и не смог придумать как это провернуть
eshch
а почему не хранить пропы как key1: 75 и т.д?
Ilya
ну это упрощеная модель приведена, сами объекты в массиве там имеют другую структуру
yopp
а почему не хранить пропы как key1: 75 и т.д?
потому что не надо их так хранить
yopp
если потом надо будет индексировать по названию поля — это будет невозможно
yopp
а почти всегда такая задача возникает
eshch
точн
yopp
т.е. резонный запрос, формата: найди мне key5 со значением больше 17 не будет возможен
yopp
ок, просто в один запрос я тоже так и не смог придумать как это провернуть
там в 3.6 навертели чего-то для массивов, можешь посмотреть
yopp
пропустил слово «по индексу»
Ilya
просто получается что мне проще получить старый обект в коде его модернизировать до нужного состояния а в монгу уже послать обновленный - чем пытаться в монге это запросами провернуть
eshch
пропустил слово «по индексу»
я че-то тоже забыл что речь про индексы
eshch
с другой стороны могли бы уже сделать подобные индексы. ниче сложно вроде.
eshch
че-то такое ощущение что где-то такое есть
eshch
не могу вспомнить где
yopp
в мысле что не целиком обновлять документ, а только изменившиеся поля