Index

Mongodb 性能:複合查詢與移動到其他集合

  • July 4, 2016

我的應用程序使用 mongodb 來儲存訂單資訊。在某些時候發送訂單,之後我需要生成某個時間範圍內所有訂單的一些報告。

了解我的訂單文件:

{
   status: [type: String, range: 6 different statuses],
   timestamp: [date],
   customer: 
       {
           id: [int, range: about 50]
           other non searchable indexed data
       }
   other non searchable indexed data
}

使用單個集合我會查詢:

{ "status": "SENT", "customer.id" : ..., "timestamp" : {$gte: ..., $lt: ...}}

使用如下索引:

{ "status" : 1, "timestamp" : -1, "customer.id" : 1}
{ "status" : 1, "timestamp" : 1, "customer.id" : 1}

我將能夠查詢這些行。但是我發現查詢中的多個條件會減慢它的速度。

所以我的問題是:

當數據庫有數百萬個訂單時,將復合索引與復合查詢一起使用或針對不同狀態(如 order_sent、order_new、order_finished)使用多個集合是否更好(性能方面,但也是最佳實踐)。

或者換句話說,額外標準對正確索引查詢的性能影響有多大(以及建議的索引是否適用於這種情況)。

從 2.6 開始,MongoDB 支持索引交集。

https://docs.mongodb.com/manual/core/index-intersection/

根據我的一般經驗,您的查詢並不復雜,無需擔心。

您當然應該為狀態(特別是因為它是一個字元串)、customer.id 和時間戳創建索引,但其餘部分留給 MongoDB 內部。你當然也可以創建一個複合索引,並使用 .hint() 來做一些基準測試,讓 MongoDB 使用特定的索引。

https://docs.mongodb.com/manual/reference/method/cursor.hint/#cursor.hint

您還應該知道,ObjectId 包含一個與文件創建時間相對應的時間戳,這很方便,因為_id 上總是有一個索引。

https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectId

引用自:https://dba.stackexchange.com/questions/142545