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
})
相關內容
查看文字索引,這可讓您有效率地搜尋和查詢以文字為基礎的資料。