Opret og slip INDEX ind Cassandra

⚡ Smart opsummering

Opret og slip indeks i Cassandra muliggør filtrering på kolonner, der ikke er en del af primærnøglen. Denne side dækker kommandoerne CREATE INDEX og DROP INDEX, navngivningsregler, tilgængelige indekstyper og de tilfælde, hvor et indeks er det forkerte svar.

  • 🔎 Hvorfor indeksere: Uden et indeks kan en WHERE-klausul kun referere til primære nøglekolonner.
  • 🏷️ Navngivningsregel: Et unavngivet indeks oprettes som TableName_ColumnName_idx og skal slettes med dette navn.
  • 🔁 Automatisk vedligeholdelse: Eksisterende rækker indekseres ved oprettelse, og nye rækker indekseres ved skrivning uden yderligere handling.
  • 🚫 Begrænsninger: Primære nøglekolonner er allerede indekseret, så et sekundært indeks på dem afvises.
  • 📉 Kardinalitetsspørgsmål: Kolonner med meget høj eller meget lav kardinalitet gør et indeks langsomt eller ubrugeligt.
  • 🧱 Bedre alternativ: En specialbygget forespørgselstabel yder normalt bedre end et sekundært indeks i stor skala.

Opret og slip indeks i Cassandra

Cassandra Opret indeks

Kommandoen 'Opret indeks' opretter et indeks på kolonnen angivet af brugeren. Hvis dataene allerede findes for den kolonne, du vil indeksere, Cassandra opretter indekser på dataene under udførelsen af ​​'create index'-sætningen.

  • Efter oprettelse af et indeks, Cassandra indekserer automatisk nye data, når data indsættes.
  • Indekset kan ikke oprettes på primærnøgle, da en primærnøgle allerede er indekseret.
  • Indekser på samlingskolonner understøttes ved hjælp af formularerne NØGLE, VÆRDIER eller INDSTIGNINGER, afhængigt af hvad der skal søges i.
  • Uden indeksering på kolonnen, Cassandra kan ikke filtrere den kolonne, medmindre det er en primærnøgle.

Derfor, for filtrering af kolonner i Cassandra, der skal oprettes indekser.

Syntaks

CREATE INDEX IndexName ON KeyspaceName.TableName (ColumnName);

Eksempel

Her er det øjebliksbillede, hvor det blev forsøgt at filtrere "dept"-kolonnen uden at oprette indekset. Som svar blev fejlen returneret.

Cassandra Opret indeks

Her er det øjebliksbillede, hvor indeks oprettes på afd. kolonne.

Cassandra Opret indeks

CREATE INDEX DeptIndex ON University.Student (dept);

Her er et øjebliksbillede, hvor det med succes vil blive filtreret 'dept' kolonne.

Cassandra Opret indeks

SELECT * FROM University.Student WHERE dept = 'CS';

Indeksnavnet er valgfrit. Hvis det udelades, kan Cassandra generere en automatisk, hvilket er vigtigt, når indekset senere skal slettes.

CREATE INDEX IF NOT EXISTS ON University.Student (dept);

Cassandra Drop Index

Kommandoen 'Drop index' dropper det angivne indeks. Hvis indeksnavnet ikke blev givet under oprettelsen af ​​indekset, er indeksnavnet TableName_ColumnName_idx.

  • Hvis indekset ikke eksisterer, vil det returnere en fejl, medmindre IF EXISTS bruges, vil det returnere no-op.
  • Du skal angive nøglerumsnavnet sammen med indeksnavnet, ellers vil indekset blive søgt efter i det aktuelle nøglerum.

Syntaks

DROP INDEX IF EXISTS KeyspaceName.IndexName;

Eksempel

Her er et øjebliksbillede af den udførte kommando 'Drop index', der dropper indekset DeptIndex.

Cassandra Drop Index

DROP INDEX IF EXISTS University.DeptIndex;

Efter vellykket udførelse af kommandoen vil DeptIndex blive slettet fra tasterummet. Nu kan data ikke filtreres af kolonneafdelingen.

For at bekræfte hvilke indekser der findes før dropping for det første, beskriv tabellen og læs indeksdefinitionerne nederst i outputtet.

DESCRIBE TABLE University.Student;

Typer af indeks i Cassandra

Kommandoen ovenfor opretter et standard sekundært indeks, men der findes tre forskellige mekanismer, og de opfører sig meget forskelligt.

Type Sådan fungerer det Bedste for
Sekundært indeks Hver node indekserer kun sine egne lokale data, så en forespørgsel uden en partitionsnøgle skal kontakte hver node. Moderate kardinalitetskolonner forespørges sammen med en partitionsnøgle.
SASI-indeks Et vedhæftet indeks, der understøtter matchning af LIKE-præfikser og -suffikser samt numeriske intervaller. Tekstsøgemønstre. Stadig markeret som eksperimentel, så test før brug i produktion.
Storage Attached Index (SAI) Indført i Cassandra 5.0, der deler én indeksstruktur på tværs af kolonner med lavere skriveoverhead. Den moderne erstatning for begge ovenstående Cassandra 5 klynger.

Indeksering af en samlingskolonne bruger en modifikator, der angiver, hvilken del der skal indekseres.

CREATE INDEX ON University.Teacher (VALUES(Email));
CREATE INDEX ON University.Course (KEYS(prereq));
CREATE INDEX ON University.Course (ENTRIES(prereq));

VÆRDIER søger i elementerne i et sæt eller en liste, KEYS søger i kortnøgler, og ENTRIES matcher et nøgle- og værdipar sammen. Samlingsindeksering er dækket yderligere i Cassandra kollektioner tutorial.

Hvornår man ikke skal bruge et indeks Cassandra

Et sekundært indeks er praktisk, men det er ikke et relationelt indeks, og det at bruge et på det forkerte sted er en almindelig årsag til langsomme klynger. Fire situationer kræver en anden tilgang.

  • Meget høj kardinalitet. Indeksering af noget, der er tæt på unikt, såsom en e-mailadresse, betyder, at næsten hver partition indeholder én matchende række, så forespørgslen spreder sig ud over hele klyngen for at returnere en enkelt post.
  • Meget lav kardinalitet. Indeksering af et flag med to værdier, såsom aktiv eller inaktiv, producerer enorme indekspartitioner, og læsning af én af dem returnerer halvdelen af ​​tabellen.
  • Hyppigt opdaterede kolonner. Hver ændring skriver en indekspost og en tombstone til den gamle, så tombstone-ophobning forringer læsninger over tid.
  • Forespørgsler uden partitionsnøgle. Uden en sådan skal koordinatoren kontakte alle noder og flette resultaterne sammen, hvilket ikke skaleres, efterhånden som noder tilføjes.

Det holdbare alternativ er en anden tabel, der er indtastet af den kolonne, der skal søges i, og som skrives samtidig med den første. Det følger forespørgsels-først-princippet, der er beskrevet i Cassandra regler for datamodeller, og den gemmer hver læsning til en enkelt partition på en enkelt node.

Som en arbejdsregel passer et indeks til en kolonne med moderat kardinalitet, der forespørges sammen med en kendt partitionsnøgle. Alt uden for denne beskrivelse er bedre tjent med en specialbygget tabel.

Ofte Stillede Spørgsmål

Der er ingen hård grænse, men hvert indeks tilføjer skriveomkostninger og hukommelse. To eller tre pr. tabel er et praktisk loft; ud over det bør du i stedet genoverveje datamodellen.

Nej. Eksisterende rækker indekseres i baggrunden, og tabellen forbliver tilgængelig. Store tabeller tager tid, og fremskridt kan overvåges med nodetool compactionstats.

Et indeks peger tilbage på rækker i basistabellen. En materialiseret visning er en separat tabel, der vedligeholdes automatisk med sin egen partitionsnøgle, så dens læsninger rammer én partition.

Med udgangspunkt i forespørgselslisten og kolonnekardinaliteten kan AI rangere kandidater fornuftigt. Den kan ikke se opdateringsfrekvensen, hvilket ofte afgør, om indekset vil akkumulere tombstones.

Ofte fordi det får en afvist forespørgsel til at køre. Betragt dette forslag som et signal om, at enten et indeks eller en ny forespørgselstabel virkelig er påkrævet.

Opsummer dette indlæg med: