MongoDB技巧——不要到處使用索引

出版圈郭志敏發表於2012-02-07

上面的介紹使你驚歎於索引的強大作用,但要提醒你,不是所有查詢都可以用索引 的。比如,在剛才的例子中,要是需要返回集合中90% 的文件而非獲取一些記錄, 就不應該用索引。

如果對這種查詢用了索引,結果就是幾乎遍歷整個索引樹,把其中一部分,比方說 60 GB 的索引都載入到記憶體。然後按照索引中的指標載入集合中230 GB 的文件數 據。最終將載入230 GB + 60 GB =290 GB,比不用索引還多。

所以,索引一般用在返回結果只是總體資料的一小部分的時候。根據經驗,一旦要 大約返回集合一半的資料就不要使用索引了。

若是已經對某個欄位建立了索引,又想在大規模查詢時不使用它(因為使用索引可能 會較低效),可以使用自然排序,用{"$natural" : 1} 來強制MongoDB 禁用索引。 自然排序就是“按照磁碟上的儲存順序返回資料”,這樣MongoDB 就不會使用索引了:

db.foo.find().sort({"$natural" : 1})

如果某個查詢不用索引,MongoDB 會做全表掃描,即逐個掃描文件,遍歷整個集 合,以找到結果。

寫入速度

每當增加、刪除、更新記錄,所有相應的索引也必須更新。插入文件時,MongoDB 需要找到文件中的值在每一個索引樹中的位置,然後在那兒插入。刪除時,要找到 樹中的索引項並刪除。更新時,也可能像插入時那樣新建索引項,也可能像刪除時 那樣刪除索引項,若是值更新了就會既有新增又有刪除。所以,索引會增加很多額 外的寫入。

相關文章