Монго ищет большое количество монго идентификаторов - PullRequest
2 голосов
/ 13 марта 2012
    //Search results for mongo_ids  
    foreach ($results->response->docs as $doc)
    {
        $mongo_ids[] = new MongoId($doc->mongo_id);
    }
    $search['_id'] = array('$in' => $mongo_ids);

Если у меня в результатах поиска будет 100 идентификаторов монго ... будет ли запрос на монго действительно медленным?

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Поле _id индексируется по умолчанию, поэтому запрос IN должен быть очень быстрым, даже если он соответствует многим записям.

Я делаю то же самое с сотнями идентификаторов и никогда не испытываю проблем с производительностью.

0 голосов
/ 25 мая 2012

Конечно, с ростом числа идентификаторов, которые вы используете в запросе $in, будет все больше проблем. Мы испытали значительное увеличение времени выполнения запросов с массивами из нескольких тысяч идентификаторов.

Вы можете увидеть, сколько документов сканируется во время выполнения вашего запроса, используя функцию объяснение () в оболочке MongoDB (или используя упакованные запросы):

{"$query" : {"foo" : "bar"}, "$explain" : true}

Количество отсканированных документов должно быть как можно ближе к числу возвращенных документов.

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

user :
{
    'likes' : [
        ObjectId(song_id1),
        ObjectId(song_id2),
        ...
    ]
}

Вы можете иметь:

song :
{
    'likedBy' : [
        ObjectId(user_id1),
        ObjectId(user_id2),
        ...
    ]
}

тогда вы можете просто запросить песни, для которых {'likedBy' : ObjectId(yourUserId)} (MongoDB будет искать идентификатор в массиве). Конечно, это зависит от ситуации, и этот пример тривиален, но иногда вы можете значительно ускорить запрос, изменив отношение и, возможно, добавив некоторую избыточность данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...