Megosztás a következőn keresztül:


Ajánlott indexelési eljárások az Azure DocumentDB-ben

A lekérdezhető mezőknek mindig létre kell hozniuk az indexeket

A predikátumok és aggregátumok alapján végzett olvasási műveletek a megfelelő szűrők indexét tekintik át. Indexek hiányában az adatbázismotor dokumentumvizsgálatot végez az egyező dokumentumok lekéréséhez. A vizsgálatok mindig költségesek, és egyre drágábbak lesznek, ahogy a gyűjteményben lévő adatok mennyisége növekszik. Az optimális lekérdezési teljesítmény érdekében mindig létre kell hozni az indexeket az összes lekérdezhető mezőhöz.

Kerülje a szükségtelen indexelést és az összes mező alapértelmezés szerinti indexelését

Az indexeket csak lekérdezhető mezőkhöz szabad létrehozni. A helyettesítő karakterek indexelése csak akkor használható, ha a lekérdezési minták kiszámíthatatlanok, ha a dokumentumstruktúra bármely mezője része lehet a lekérdezési szűrőknek.

Jótanács

Az Azure DocumentDB alapértelmezés szerint csak a _id mezőt indexeli. A többi mező alapértelmezés szerint nem indexelt. Az indexelendő mezőket előre kell megtervezni a lekérdezési teljesítmény maximalizálása érdekében, ugyanakkor minimalizálni kell a túl sok mező indexeléséből származó írásokra gyakorolt hatást.

Ha első alkalommal szúr be új dokumentumot, vagy egy meglévő dokumentumot frissít vagy töröl, az indexben megadott mezők is frissülnek. Ha az indexelési szabályzat nagy számú mezőt (vagy a dokumentum összes mezőjét) tartalmaz, a kiszolgáló több erőforrást használ fel a megfelelő indexek frissítésekor. Nagy léptékű futtatáskor csak a lekérdezhető mezőket kell indexelni, míg a lekérdezési predikátumokban nem használt összes többi mezőt ki kell zárni az indexből.

Indexelési stratégia a hatékony adatbetöltéshez

Az Azure DocumentDB-be történő nagy számítási feladatok áttelepítéséhez ajánlott indexeket létrehozni az adatbetöltés után a hatékony végrehajtás érdekében. Ez jelentősen csökkenti az írási többletterhelést, minimalizálja az erőforrás-felhasználást, és felgyorsítja az adatbetöltési teljesítményt. Az indexek tömeges betöltése során történő karbantartása lelassíthatja a beszúrásokat, mivel minden írási műveletnek frissítenie kell az összes alkalmazható indexet.

Több index létrehozásakor az előzményadatokon minden egyes mezőhöz nemblokkoló createIndex parancsokat kell kiadni.

Nem mindig lehet előre megtervezni az összes lekérdezési mintát, különösen az alkalmazáskövetelmények fejlődésével. A változó alkalmazási igények elkerülhetetlenné teszik, hogy mezőket adjunk hozzá egy nagy mennyiségű előzményadatot tartalmazó klaszter indexéhez.

Ilyen esetekben minden createIndex-parancsot aszinkron módon kell kiadni anélkül, hogy a kiszolgáló válaszára kellene várni.

Megjegyzés:

Alapértelmezés szerint az Azure DocumentDB csak akkor válaszol a createIndex műveletre, ha az index teljes mértékben az előzményadatokra épül. A fürt méretétől és a betöltött adatok mennyiségétől függően ez időt vehet igénybe, és úgy tűnhet, mintha a szerver nem reagálna a "createIndex" parancs végrehajtására.

Ha a createIndex-parancsokat a Mongo Shellen keresztül adják ki, a Ctrl + C billentyűkombinációval megszakíthatja a parancsot, hogy ne várjon a válaszra, és adja ki a következő műveletkészletet.

Megjegyzés:

A Ctrl + C billentyűkombinációval megszakíthatja a createIndex parancsot a kiadás után, és nem állítja le az index buildelési műveletét a kiszolgálón. Egyszerűen megakadályozza, hogy a Rendszerhéj a kiszolgáló válaszára várjon, míg a kiszolgáló aszinkron módon továbbra is létrehozza az indexet a meglévő dokumentumokon.

Összetett indexek létrehozása több mezőre vonatkozó predikátumokkal rendelkező lekérdezésekhez

Az összetett indexeket a következő forgatókönyvekben kell használni:

  • Több mező szűrőit tartalmazó lekérdezések
  • Több mező szűrőit tartalmazó lekérdezések, és egy vagy több mező növekvő vagy csökkenő sorrendbe rendezve

Vegye figyelembe a következő dokumentumot a "cosmicworks" adatbázisban és az "employee" gyűjteményben

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

Fontolja meg a következő lekérdezést az összes "Smith" vezetéknevű alkalmazott megkeresésére, akik több mint öt éve dolgoznak a szervezetnél.

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

A "lastName" és a "timeInOrgInYears" összetett indexe optimalizálja ezt a lekérdezést:

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

CreateIndex-művelet állapotának nyomon követése

Az indexek hozzáadásakor és az előzményadatok indexelésekor az index buildelési műveletének előrehaladása nyomon követhető a db.currentOp() használatával.

Tekintse meg ezt a mintát a "kozmikus munka" adatbázis indexelési folyamatának nyomon követéséhez.

use cosmicworks;
db.currentOp()

Amikor egy createIndex-művelet folyamatban van, a válasz a következőképpen néz ki:

{
  "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
}

Nagy indexkulcsok engedélyezése alapértelmezés szerint

Még akkor is, ha a dokumentumok nem tartalmaznak nagy számú karaktert tartalmazó kulcsokat, vagy a dokumentumok nem tartalmaznak több beágyazási szintet, a nagyméretű indexkulcsok megadásával biztosítható, hogy ezek a forgatókönyvek lefedve legyenek. Most a nagy indexkulcs a motor alapértelmezett viselkedése.

Fontolja meg ezt a mintát a nagyméretű indexkulcsok engedélyezéséhez a "large_index_coll" gyűjteményben a "cosmicworks" adatbázisban.

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

Indexépítések előnyben részesítése az új írási műveletekkel szemben a blokkolási opcióval

Azokban az esetekben, amikor az indexet az adatok betöltése előtt létre kell hozni, a blokkolási beállítást kell használni a bejövő írások letiltására, amíg az index összeállítása befejeződik.

A beállítás { "blocking": true } olyan migrálási segédprogramokban hasznos, ahol az indexek üres gyűjteményeken jönnek létre az adatírás megkezdése előtt.

Vegyünk egy példát a "kozmikus munka" adatbázis "alkalmazott" gyűjteményében található indexlétrehozás blokkolási lehetőségére:

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

Tekintse meg a szövegindexelést, amely lehetővé teszi a szövegalapú adatok hatékony keresését és lekérdezését.

Következő lépés