Apache Cassandra Grundkurs

Sekundäre Indizes

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Cassandra lässt Filterung grundsätzlich nur auf Spalten des Primärschlüssels zu. Erfahren Sie, was sekundäre Indizes sind und wie Sie diese für Ihre Zwecke einsetzen können.
09:19

Transkript

Manchmal kann es vorkommen, dass wir in der Where-Klausel von einem Select-Statement auch nach anderen Spalten als dem Schlüssel filtern möchten. Das wird normalerweise von Cassandra aus Sorge um die Performance verhindert. Sehen Sie in diesem Video, wie Sie mit Hilfe von sekundären Indizes auch andere Spalten als den Primärschlüssel eingrenzen können. Sie können einen Sekundärindex nicht nur auf einfache Datentypen, sondern auch auf Collections erstellen. Zu den Collections gehören Listen, Sets und Maps. Bei Maps können Sie sogar entscheiden, ob Sie die Keys oder Values indizieren möchten. Ein Sekundärindex ist intern als Tabelle implementiert, welche die indizierte Spalte als Primärschlüssel enthält. Sekundäre Indizes liefern uns zwar Flexibilität, sind aber mit Vorsicht zu genießen. Zunächst sollten Sie beachten, dass Indizes verteilt gespeichert werden. Das heißt, jede Node erstellt einen Index für den Anteil der Daten, der in ihren eigenen Partitionen gespeichert ist. Bitte beachten Sie hier, dass trotz der internen Implementierung als Tabelle die Partitionen des Index nicht mit Hilfe des Partitioners verteilt werden. Dementsprechend kann eine Abfrage auf eine indizierte Spalte trotzdem schlecht performen, da potentiell viele Nodes kontaktiert werden müssen. Indizierte Spalten mit hoher Kardinalität können zu sehr teuren Abfragen führen. Bei Spalten mit niedriger Kardinalität, beispielsweise Booleans, würde sich der Nutzen eines Index stark verringern, da der Index aus wenigen sehr großen Zeilen bestehen würde. Spalten, die sehr oft geändert oder gelöscht werden, können im Zusammenhang mit Sekundärindizes Fehler hervorrufen. Und bei Tabellen mit sehr großen Partitionen empfiehlt es sich, die Abfrage zunächst auf eine Partition einzugrenzen und anschließend innerhalb dieser Partition zu suchen. Seit Cassandra 3.4 gibt es einen optimierten Indextyp, den SASI-Index. Die Abkürzung steht für "SSTable Attached Secondary Index". SSTables sind die Cassandra-interne Datenstruktur zur Speicherung von Tabellen und ein solcher SASI-Index ist tatsächlich im Hintergrund an die entsprechende Tabelle angefügt und nicht mehr als eigene Tabelle implementiert. Auf diese Weise gewinnt der Index an Performance, auch wenn er weiterhin verteilt gespeichert wird und daher nicht so effizient wie eine Filterung auf dem Primärschlüssel sein kann. Dieser Index ermöglicht mehr Operatoren als der klassische sekundäre Index. Wir können einerseits auf Gleichheit prüfen, neu dazugekommen ist aber auch Ungleichheit mit "" und "<", sowie Ähnlichkeit von Strings mit "LIKE" und dem Prozentoperator. Lassen Sie uns das Ganze in der CQL-Shell nachvollziehen. Dazu erstellen wir zunächst eine Tabelle "CREATE TABLE produkte" mit folgenden Spalten: Wir möchten zunächst eine ID vom Typ "int" haben, das wird auch unser "PRIMARY KEY". Dann benötigen wir noch einen Hersteller vom Typ "text" einen Namen für das Produkt, auch vom Typ "text", und schließlich die Produktfeatures, die als "map" realisiert sind, mit Text als Keys und Text als Values. Jetzt können wir die Tabelle abschließen, wunderbar. Dann fügen wir gleich mal einige Produkte ein. Diese habe ich schon vorab vorbereitet. Sehen wir uns die Tabelle an und wir haben momentan drei Produkte, zweimal von Samsung, einmal von Philips und als Features haben wir die Anschlüsse, die diese Fernseher zur Verfügung stellen. Jetzt wollen wir einmal ein Select-Statement durchführen auf die Produkte und möchten gerne alle Produkte haben, bei denen der Hersteller Samsung ist: "Samsung". Und wir sehen, Cassandra möchte uns diese Query nicht durchführen lassen. Die Query ist also nicht valide, weil Cassandra die Performance nicht vorhersagen kann, wir möchten nämlich auf eine Spalte filtern, die nicht zum Primärschlüssel gehört. Aber Cassandra schlägt uns gleich von selber vor, dass wir einfach die Option "ALLOW FILTERING" verwenden könnten; probieren wir das doch einmal. Und das funktioniert tatsächlich. Okay, das ist schonmal schön. Wir möchten uns aber trotzdem einen Index anlegen. In der Produktion möchten wir natürlich nicht "ALLOW FILTERING" verwenden. Also schreiben wir "CREATE INDEX ON" und zwar möchten wir den Index auf der Tabelle "produkte" erstellen, "produkte()" und dabei die Spalte "hersteller". Wunderbar. Jetzt probieren wir noch einmal unser Select-Statement, ohne "ALLOW FILTERING" und es funktioniert genauso wie mit "ALLOW FILTERING". Sehen wir uns doch einmal den aktuellen Keyspace an: "DESCRIBE KEYSPACE". Und wir sehen hier, der Index ist auch in der Keyspace-Beschreibung vorhanden, "CREATE INDEX produkte_hersteller_idx". Das ist die standardmäßige Benennung von Indizes durch Cassandra, Tabelle, Spalte, idx auf der Tabelle "produkte" im Keyspace "training". Jetzt möchten wir einmal auf der Spalte "features" filtern, und zwar auf den Keys der Map. Das heißt, wir können jetzt einen Index erstellen: "CREATE INDEX ON produkte" und zwar auf der Spalte "features", aber da wir hier die Keys indizieren möchten, müssen wir noch einmal das Schlüsselwort "KEYS" um die Features packen. Einmal mit "Enter" bestätigen und jetzt können wir einmal eine Select-Abfrage auf diese Spalte, bzw. auf die Keys, durchführen: "SELECT * FROM produkte" und zwar "WHERE features", jetzt kommt das Schlüsselwort "CONTAINS KEY" und wir möchten jetzt nach allen Produkten suchen, die einen Klinkenanschluss bieten. Perfekt, wir bekommen zwei Produkte mit einem Klinkenanschluss. Jetzt möchten wir aber auch alle Produkte gelistet bekommen, die genau zwei Anschlüsse von einem bestimmten Typ haben. Uns interessiert in diesem Fall nicht, welcher Typ. Also schreiben wir "SELECT * FROM produkte WHERE features", weiterhin "CONTAINS", diesmal aber nicht "KEY", sondern direkt "2x", also zwei Mal und wir schreiben zusätzlich "ALLOW FILTERING", denn wir haben die Values dieser Map nicht indiziert. Und wir sehen, das funktioniert auch wunderbar. Wir bekommen den einen Fernseher, der zwei HDMI-Anschlüsse hat. Jetzt wollen wir uns aber auch noch den SASI-Index ansehen. Dazu erstellen wir eine neue Tabelle -- "CREATE TABLE mitarbeiter" -- mit folgenden Spalten: Wir nehmen einmal eine Spalte "name" vom Typ "text", und das wird auch unser "PRIMARY KEY" und wir nehmen eine zweite Spalte "vorname", auch vom Typ "text". Jetzt können wir die Tabelle abschließen und wir fügen einige Mitarbeiterdaten ein, die ich hier auch schon vorbereitet habe. Und jetzt möchten wir uns alle Mitarbeiter ausgeben lassen, deren Vorname mit einem "A" anfängt. Das wären also Anton Meier und Annabelle Huber. Dazu erstellen wir einen neuen Index, das ist jetzt aber kein normaler Index, sondern ein Custom Index, "CREATE CUSTOM INDEX ON mitarbeiter" und zwar auf der Spalte "vorname" und dabei benutzen wir eine spezielle Klasse. Diese hat den vollen Pfad: "org.apache.cassandra.index .sasi.SASIIndex". Und schon ist der Index erstellt. Jetzt können wir uns einmal alle Mitarbeiter anzeigen lassen: "SELECT * FROM mitarbeiter". Soweit alles wie erwartet. Jetzt aber zu unserem eigentlichen Anliegen: "SELECT * FROM mitarbeiter" und zwar an der Stelle, an der "vorname" jetzt nicht "=", sondern "LIKE A%" ist, also alle Vornamen, die mit "A" anfangen. Und perfekt, genau das, was wir haben wollten. Jetzt können wir wieder unsere Tabellen aufräumen: "DROP TABLE mitarbeiter" und schließlich "DROP TABLE produkte". In diesem Video haben Sie gesehen, wie Sie Spalten in Cassandra indizieren können und wie diese Indizes realisiert sind. Sie haben den einfachen Sekundärindex sowie den SASI-Index kennengelernt und wissen, dass diese Indizes verteilt gespeichert werden und deshalb nicht unbedingt für gute Performance sorgen können.

Apache Cassandra Grundkurs

Lernen Sie, wie Sie Apache Cassandra als hoch verfügbare und skalierbare Datenbank einsetzen können.

2 Std. 11 min (26 Videos)
Derzeit sind keine Feedbacks vorhanden...
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.02.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!