//Search results for mongo_ids
foreach ($results->response->docs as $doc)
{
$mongo_ids[] = new MongoId($doc->mongo_id);
}
$search['_id'] = array('$in' => $mongo_ids);
如果我有蒙戈id的100在搜索結果......將在蒙戈查詢中很慢的?蒙戈搜索大量蒙戈IDS
//Search results for mongo_ids
foreach ($results->response->docs as $doc)
{
$mongo_ids[] = new MongoId($doc->mongo_id);
}
$search['_id'] = array('$in' => $mongo_ids);
如果我有蒙戈id的100在搜索結果......將在蒙戈查詢中很慢的?蒙戈搜索大量蒙戈IDS
默認情況下,_id
字段被編入索引,因此IN查詢應該非常快速,即使它的匹配很多記錄。
我用數百個ID做同樣的事情,從來沒有任何性能問題。
當然,隨着您在$in
查詢中使用的ID的數量增加,它會越來越成問題。在數千個ID的數組中,我們經歷了查詢執行時間的顯着增加。
你可以看到有多少文件被掃描的同時,通過在MongoDB的外殼採用explain()功能(或使用包裹查詢)執行查詢:
{"$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將查找數組中的id)。當然,這取決於情況,這個例子很簡單,但有時你可以通過反轉關係來加快查詢速度,也可以增加一些數據冗餘。
如果我的集合中有數千個文檔,該怎麼辦?它會變慢嗎? – guiomie 2012-04-15 14:52:57
數以百計還行。成千上萬的人幾乎可以。數十萬不會。我和一個大約300K文件的數據庫有相同的問題,甚至與索引一樣,它的速度非常慢,特別是當匹配的IDS列表很長時 – ibtarek 2012-09-16 15:15:42