Osvědčené postupy indexování ve službě Azure Cosmos DB pro virtuální jádro MongoDB
PLATÍ PRO: Virtuální jádro MongoDB
Dotazovatelná pole by měla vždy obsahovat vytvořené indexy.
Operace čtení založené na predikátech a agregaci najdete v indexu odpovídajících filtrů. V případě absence indexů databázový stroj provede kontrolu dokumentu a načte odpovídající dokumenty. Kontroly jsou vždy nákladné a postupně se zdražují s rostoucím objemem dat v kolekci. Pro optimální výkon dotazů by se indexy měly vždy vytvářet pro všechna dotazovatelná pole.
Vyhněte se zbytečným indexům a indexujte všechna pole ve výchozím nastavení.
Indexy by měly být vytvořeny pouze pro dotazovatelná pole. Indexování se zástupnými znamény by se mělo použít jenom v případě, že vzory dotazů jsou nepředvídatelné, pokud jakékoli pole ve struktuře dokumentu může být součástí filtrů dotazů.
Tip
Azure Cosmos DB pro MongoDB virtuální jádro ve výchozím nastavení indexuje pouze pole _id. Ve výchozím nastavení nejsou indexována všechna ostatní pole. Pole, která se mají indexovat, by se měla předem naplánovat, aby se maximalizoval výkon dotazů a zároveň se minimalizoval dopad na zápisy z indexování příliš velkého počtu polí.
Při prvním vložení nového dokumentu nebo při první aktualizaci nebo odstranění existujícího dokumentu se aktualizují také všechna zadaná pole v indexu. Pokud zásada indexování obsahuje velký počet polí (nebo všechna pole v dokumentu), server využívá více prostředků při aktualizaci odpovídajících indexů. Při spuštění ve velkém měřítku by se měla indexovat pouze dotazovatelná pole, zatímco všechna zbývající pole, která se v predikátech dotazů nepoužívají, by měla zůstat vyloučena z indexu.
Vytvoření potřebných indexů před příjmem dat
Pro zajištění optimálního výkonu by se indexy měly vytvořit předem před načtením dat. Všechny zápisy, aktualizace a odstranění dokumentu synchronně aktualizují odpovídající indexy. Pokud se po ingestování dat vytvoří indexy, budou se k indexování historických dat spotřebovávat další prostředky serveru. V závislosti na velikosti historických dat je tato operace časově náročná a má vliv na výkon čtení a zápisu v stabilním stavu.
Poznámka:
V situacích, kdy je potřeba přidat změny vzorů čtení a indexů, by mělo být povolené indexování na pozadí, které je možné provést prostřednictvím lístku podpory.
U více indexů vytvořených v historických datech zablokujte příkazy createIndex pro každé pole.
Vždy není možné předem plánovat všechny vzory dotazů, zejména s tím, jak se vyvíjejí požadavky na aplikace. Změna potřeb aplikace vyžaduje, aby se pole přidala do indexu v clusteru s velkým množstvím historických dat.
V takových scénářích by měl být každý příkaz createIndex vystaven asynchronně bez čekání na odpověď ze serveru.
Poznámka:
Azure Cosmos DB pro MongoDB ve výchozím nastavení reaguje na operaci createIndex až po úplném sestavení indexu na historických datech. V závislosti na velikosti clusteru a objemu přijatých dat to může chvíli trvat a může se zobrazit, jako by server nereagoval na příkaz createIndex.
Pokud se příkazy createIndex vydávají prostřednictvím prostředí Mongo Shell, pomocí ctrl + C přerušte příkaz, který zastaví čekání na odpověď a vydá další sadu operací.
Poznámka:
Pokud chcete přerušit příkaz createIndex po vydání, pomocí ctrl + C neukončil operaci sestavení indexu na serveru. Prostředí jednoduše zastaví čekání na odpověď ze serveru, zatímco server asynchronně pokračuje v sestavování indexu nad existujícími dokumenty.
Vytváření složených indexů pro dotazy s predikáty na více polích
Složené indexy by se měly používat v následujících scénářích:
- Dotazy s filtry pro více polí
- Dotazy s filtry pro více polí a s jedním nebo více poli seřazenými vzestupně nebo sestupně
Vezměte v úvahu následující dokument v databázi "kosmické práce" a v kolekci "employee"
{
"firstName": "Steve",
"lastName": "Smith",
"companyName": "Microsoft",
"division": "Azure",
"subDivision": "Data & AI",
"timeInOrgInYears": 7
}
Zvažte následující dotaz, abyste našli všechny zaměstnance s příjmením Smith v organizaci po dobu více než 5 let:
db.employee.find({"lastName": "Smith", "timeInOrgInYears": {"$gt": 5}})
Složený index pro lastName i timeInOrgInYears optimalizuje tento dotaz:
use cosmicworks;
db.employee.createIndex({"lastName" : 1, "timeInOrgInYears" : 1})
Sledování stavu operace createIndex
Při přidávání indexů a je potřeba indexovat historická data, průběh operace sestavení indexu je možné sledovat pomocí db.currentOp().
Tuto ukázku zvažte ke sledování průběhu indexování v databázi "vesmírných děl".
use cosmicworks;
db.currentOp()
Když probíhá operace createIndex, odpověď vypadá takto:
{
"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
}
Povolení velkých indexových klíčů ve výchozím nastavení
I když dokumenty neobsahují klíče s velkým počtem znaků nebo dokumenty neobsahují více úrovní vnoření, zadání velkých indexových klíčů zajistí, že jsou tyto scénáře pokryté.
Tento sampe zvažte, pokud chcete povolit velké indexové klíče v kolekci "large_index_coll" v databázi "kosmické práce".
use cosmicworks;
db.runCommand(
{
"createIndexes": "large_index_coll",
"indexes": [
{
"key": { "ikey": 1 },
"name": "ikey_1",
"enableLargeIndexKeys": true
}
]
})
Stanovení priority sestavení indexu před novými operacemi zápisu pomocí možnosti Blokování
Ve scénářích, ve kterých se má index vytvořit před načtením dat, by se měla možnost blokování použít k blokování příchozích zápisů, dokud se sestavení indexu neskončí.
Nastavení { "blocking": true }
je zvláště užitečné v nástrojích pro migraci, kde se indexy vytvářejí v prázdných kolekcích před zahájením zápisu dat.
Představte si příklad možnosti blokování pro vytvoření indexu v kolekci "employee" v databázi "kosmické práce":
use cosmicworks;
db.runCommand({
createIndexes: "employee",
indexes: [{"key":{"name":1}, "name":"name_1"}],
blocking: true
})
Související obsah
Podívejte se na indexování textu, které umožňuje efektivní vyhledávání a dotazování textových dat.