共用方式為


Azure Cosmos DB for MongoDB V 核心中的編製索引最佳做法

適用於: MongoDB 虛擬核心

可查詢的欄位應該一律已建立索引

根據述詞和彙總的讀取作業會參考對應篩選的索引。 如果沒有索引,資料庫引擎會執行文件掃描來擷取相符的文件。 掃描總是很昂貴,而且隨著集合中的資料量成長,掃描會逐漸變得更昂貴。 為了獲得最佳查詢效能,應該一律為所有可查詢欄位建立索引。

預設避免不必要的索引和針對所有欄位編製索引

索引應該只針對可查詢欄位建立。 應該只有在查詢模式無法預測時,才使用萬用字元索引,其中文件結構中的任何欄位都可以是查詢篩選的一部分。

提示

Azure Cosmos DB for MongoDB V 核心預設只會為 _id 欄位編製索引。 所有其他欄位預設不會編製索引。 應事先規劃要編製索引的欄位,以將查詢效能最大化,同時將針對太多欄位編製索引對寫入的影響降至最低。

第一次插入新文件或更新或刪除現有文件時,索引中的每個指定欄位也會更新。 如果編製索引原則包含大量欄位 (或文件中的所有欄位),伺服器會耗用更多資源來更新對應的編製索引。 大規模執行時,應該只針對可查詢欄位編製索引,而查詢述詞中未使用的所有剩餘欄位都應該保持從索引中排除。

在資料擷取之前建立必要的索引

為了達到最佳效能,在載入資料之前應該先建立索引。 所有文件寫入、更新和刪除都會同步更新對應的索引。 如果在擷取資料之後建立索引,則會耗用更多伺服器資源來針對歷程記錄資料編製索引。 依據歷程記錄資料的大小而定,這項作業相當耗時,而且會影響穩定的狀態讀取和寫入效能。

注意

對於需要新增讀取模式變更和索引的案例,應該啟用背景編製索引,這可以透過支援票證來完成。

針對在歷程記錄資料上建立的多個索引,針對每個欄位發出非封鎖 createIndex 命令

不一定能預先規劃所有查詢模式,隨著應用程式需求的發展更是如此。 變更應用程式時,不可避免地需要將欄位新增至具有大量歷程記錄資料的叢集索引。

在這種情況下,應該以非同步方式發出每個 createIndex 命令,而不用等候伺服器的回應。

注意

根據預設,Azure Cosmos DB for MongoDB V 核心只有在針對歷程記錄資料完整建置索引之後,才會回應 createIndex 作業。 依據叢集大小和擷取資料量而定,這可能需要一段時間,而且伺服器看似沒有回應 createIndex 命令。

如果 createIndex 命令是透過 Mongo 殼層發出,請使用 Ctrl + C 中斷命令以停止等候回應,並發出下一組作業。

注意

在發出 createIndex 命令之後,使用 Ctrl + C 中斷它並不會終止伺服器上的索引建置作業。 只會讓殼層停止等候伺服器的回應,而伺服器會以非同步方式繼續透過現有的文件建置索引。

針對在多個欄位上具有述詞的查詢建立複合索引

複合索引應該用於下列案例:

  • 具有多欄位篩選條件的查詢
  • 具有多欄位篩選條件的查詢,具有以遞增或遞減順序排序的一或多個欄位

請考慮 'cosmicworks' 資料庫和 'employee' 集合內的下列文件

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "subDivision": "Data & AI",
    "timeInOrgInYears": 7
}

請考慮下列查詢,尋找所有姓氏為 'Smith' 且組織已超過 5 年的員工:

db.employee.find({"lastName": "Smith", "timeInOrgInYears": {"$gt": 5}})

'lastName' 和 'timeInOrgInYears' 上的複合索引會最佳化此查詢:

use cosmicworks;
db.employee.createIndex({"lastName" : 1, "timeInOrgInYears" : 1})

追蹤 createIndex 作業的狀態

新增索引並且需要針對歷程記錄資料編製索引時,可以使用 db.currentOp() 追蹤索引建置作業的進度。

請考慮此範例來追蹤 'cosmicworks' 資料庫上的編製索引進度。

use cosmicworks;
db.currentOp()

當 createIndex 作業進行中時,回應看起來會像這樣:

{
  "inprog": [
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451493:1719209762286363",
      "op_prefix": 30000451493,
      "currentOpTime": "2024-06-24T06:16:02.000Z",
      "secs_running": 0,
      "command": { "aggregate": "" },
      "op": "command",
      "waitingForLock": false
    },
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451876:1719209638351743",
      "op_prefix": 30000451876,
      "currentOpTime": "2024-06-24T06:13:58.000Z",
      "secs_running": 124,
      "command": { "createIndexes": "" },
      "op": "workerCommand",
      "waitingForLock": false,
      "progress": {},
      "msg": ""
    }
  ],
  "ok": 1
}

預設啟用大型索引鍵

即使文件不包含具有大量字元的索引鍵,或文件不包含多個巢狀層級,指定大型索引鍵可確保涵蓋這些案例。

請考慮此範例,在 'cosmicworks' 資料庫中的 'large_index_coll' 集合上啟用大型索引鍵。

use cosmicworks;
db.runCommand(
{
 "createIndexes": "large_index_coll",
 "indexes": [
    {
        "key": { "ikey": 1 },
        "name": "ikey_1",
        "enableLargeIndexKeys": true
    }
    ]
})

使用封鎖選項讓索引建置優先於新的寫入作業

針對在載入資料之前應該建立索引的案例,應該使用封鎖選項來封鎖傳入寫入,直到索引建置完成為止。

設定 { "blocking": true } 在移轉公用程式中特別有用,其中索引是在資料寫入開始前於空集合上建立。

請考慮在 'cosmicworks' 資料庫中 'employee' 集合上索引建立的封鎖選項範例:

use cosmicworks;
db.runCommand({
  createIndexes: "employee",
  indexes: [{"key":{"name":1}, "name":"name_1"}],
  blocking: true
})

查看文字索引,這可讓您有效率地搜尋和查詢以文字為基礎的資料。

後續步驟