Másodlagos indexelés az Apache Cassandra-hoz készült Azure Cosmos DB-ben

A KÖVETKEZŐKRE VONATKOZIK: Cassandra

Az Azure Cosmos DB Cassandra API-ja a mögöttes indexelési infrastruktúrát használja a platformban rejlő indexelési erő felfedéséhez. A NoSQL-hez készült alapvető API-val ellentétben azonban az Azure Cosmos DB Cassandra API-ja alapértelmezés szerint nem indexeli az összes attribútumot. Ehelyett támogatja a másodlagos indexelést, hogy indexet hozzon létre bizonyos attribútumokon, amelyek ugyanúgy viselkednek, mint az Apache Cassandra.

Általában nem ajánlott szűrő lekérdezéseket végrehajtani a nem particionált oszlopokon. Explicit módon kell használnia az ALLOW FILTERING szintaxist, ami olyan műveletet eredményez, amely nem feltétlenül működik megfelelően. Az Azure Cosmos DB-ben az ilyen lekérdezéseket alacsony számosságú attribútumokon futtathatja, mivel ezek a partíciók között futnak az eredmények lekéréséhez.

Nem ajánlott indexet létrehozni egy gyakran frissített oszlopban. A tábla definiálásakor érdemes indexet létrehozni. Ez biztosítja, hogy az adatok és az indexek konzisztens állapotban legyenek. Ha új indexet hoz létre a meglévő adatokon, jelenleg nem követheti nyomon a tábla indexállapot-változását. Ha nyomon kell követnie a művelet előrehaladását, támogatási jegyen keresztül kell kérnie az állapotváltozást.

Megjegyzés

Másodlagos indexek csak a cikkben említett CQL-parancsokkal hozhatók létre, az erőforrás-szolgáltató segédprogramjaival (ARM-sablonok, Azure CLI, PowerShell vagy Terraform) nem. A másodlagos indexek nem támogatottak a következő objektumokon:

  • adattípusok, például a befagyasztott gyűjteménytípusok, a decimális és a variánstípusok.
  • Statikus oszlopok
  • Fürtözési kulcsok

Figyelmeztetés

A partíciókulcsok alapértelmezés szerint nem indexelhetők a Cassandra API-ban. Ha összetett elsődleges kulcs található a táblában, és vagy partíciókulcsra és fürtözési kulcsra, vagy csak partíciókulcsra szűr, ez a kívánt viselkedést fogja eredményezni. Ha azonban a fürtkulccon kívül a partíciókulcsra és más nem indexelt mezőkre szűr, az partíciókulcs-kiradigálást eredményez – még akkor is, ha a többi nem indexelt mező másodlagos indexkel rendelkezik. Ha a táblában van egy összetett elsődleges kulcs, és az összetett elsődleges kulcs partíciókulcs-értékelemére, valamint egy másik mezőre szeretne szűrni, amely nem a partíciókulcs vagy a fürtözési kulcs, győződjön meg arról, hogy explicit módon hozzáad egy másodlagos indexet a partíciókulcshoz. Ebben a forgatókönyvben az indexnek jelentősen javítania kell a lekérdezési teljesítményt, még akkor is, ha a többi nem partíciókulcs- és nem fürtözési kulcsmező nem rendelkezik indexszel. További információért tekintse át a particionálásról szóló cikket.

Példa indexelésre

Először hozzon létre egy mintakulcsteret és egy táblát a következő parancsok futtatásával a CQL-felület parancssorán:

CREATE KEYSPACE sampleks WITH REPLICATION = {'class' : 'SimpleStrategy'};
CREATE TABLE sampleks.t1(user_id int PRIMARY KEY, lastname text) WITH cosmosdb_provisioned_throughput=400;

Ezután szúrjon be felhasználói mintaadatokat a következő parancsokkal:

insert into sampleks.t1(user_id,lastname) values (1, 'nishu');
insert into sampleks.t1(user_id,lastname) values (2, 'vinod');
insert into sampleks.t1(user_id,lastname) values (3, 'bat');
insert into sampleks.t1(user_id,lastname) values (5, 'vivek');
insert into sampleks.t1(user_id,lastname) values (6, 'siddhesh');
insert into sampleks.t1(user_id,lastname) values (7, 'akash');
insert into sampleks.t1(user_id,lastname) values (8, 'Theo');
insert into sampleks.t1(user_id,lastname) values (9, 'jagan');

Ha megpróbálja végrehajtani a következő utasítást, hibaüzenet jelenik meg, amely a használatát ALLOW FILTERINGkéri:

select user_id, lastname from sampleks.t1 where lastname='nishu';

Bár a Cassandra API támogatja az ALLOW FILTERING (ENGEDÉLYEZÉS) szűrést, ahogy azt az előző szakaszban említettük, nem ajánlott. Ehelyett az alábbi példában látható módon hozzon létre egy indexet a mezőben:

CREATE INDEX ON sampleks.t1 (lastname);

Miután létrehozta az indexet a "vezetéknév" mezőben, sikeresen futtathatja az előző lekérdezést. Az Azure Cosmos DB Cassandra API-jával nem kell indexnevet megadnia. A rendszer egy alapértelmezett, formátummal tablename_columnname_idx ellátott indexet használ. Például t1_lastname_idx az előző tábla indexneve.

Az index elvetése

Az index elvetéséhez tudnia kell, hogy mi az index neve. Futtassa a desc schema parancsot a tábla leírásának lekéréséhez. A parancs kimenete tartalmazza az index nevét a formátumban CREATE INDEX tablename_columnname_idx ON keyspacename.tablename(columnname). Ezután az index nevével elvetheti az indexet az alábbi példában látható módon:

drop index sampleks.t1_lastname_idx;

Következő lépések