Sdílet prostřednictvím


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
})

Podívejte se na indexování textu, které umožňuje efektivní vyhledávání a dotazování textových dat.

Další krok