2017-03-21 8 views
0

Ich habe eine Tabelle wie folgt.Mehrere sekundäre Index in Cassandra Leistung in der gleichen Partition

CREATE TABLE posts (
topic text 
country text, 
bookmarked text, 
id uuid, 
PRIMARY KEY (topic,id) 
); 

Danach habe ich sekundären Index für Land erstellt und Lesezeichen wie folgt.

CREATE INDEX posts_country ON posts (country); 
CREATE INDEX posts_bookmarked ON posts (bookmarked); 

Jetzt Abfrage ich auf einzelne Partition mit Sekundärindex wie folgt.

select * from posts where topic='cassandra' and country='india' and bookmarked='true' allow filtering; 
select * from posts where topic='sql' and country='us' and bookmarked='true' allow filtering; 

Meine Frage ist, ob alle die Abfrage derselben Partition gehen wird (topic = cassandra oder topic = SQL) dann Filterung alle Zeile oder auf bestimmte Partition abfragen lassen? Und wie wird die Leistung beeinflusst?

Jeder Vorschlag, wie ich mit einem solchen Szenario umgehen kann, wenn es die Leistung beeinträchtigt.

Danke.

Antwort

0

Da der Partitionsschlüssel erwähnt wird, werden Daten von einer Partition gesucht. Es wäre definitiv effizienter als ohne den Partitionsschlüssel zu erwähnen und nur von der sekundären Indexspalte abgefragt zu werden (da viele Knoten abgefragt werden müssen). Aber die Leistungssteigerung hängt von Ihrem Datensatz ab.

ERMÖGLICHEN FILTERING Datenfilterung beinhaltet und dadurch unvorhersehbare Performance aufweisen.

Filterung in Daten (speziell große Datensatz) ist wahrscheinlich sehr ineffizient somit nicht bevorzugt sein. Aber es hängt davon ab, wie ineffizient es wäre.

Wenn Ihre Partition zu groß ist (zu viele Zeilen in einer Partition) und wenn Sie nach einer Spalte suchen, die den eindeutigsten Wert enthält, und Filterdaten zum Abrufen eines kleinen Datensatzes nicht effizient sind, lädt Cassandra große Datenmengen filtert sie aus.

select * from Beiträge in dem Thema = 'Cassandra' und Land = 'Indien';

Diese Abfrage effizient ist aber, wie Sie die Partition Schlüssel erwähnt haben.

select * from Beiträge in dem Thema = 'Cassandra' und Land = 'Indien' und mit Lesezeichen = 'true' Filterung erlauben;

einen Index Lesezeichen könnte die Abfrageleistung verbessern auf Hinzufügen.

Cassandra wird dann den Index mit der höchsten Selektivität verwenden, um die Zeilen zu finden, die geladen werden müssen. Es ändert jedoch nichts in Bezug auf die Notwendigkeit von ALLOW FILTERING, da es immer noch die geladenen Zeilen mit dem verbleibenden Prädikat filtern muss.

Bitte lesen Sie den folgenden Artikel.Ich denke, es hat die Antworten, die Sie benötigen, denke ich :) https://www.datastax.com/dev/blog/allow-filtering-explained-2

Darüber hinaus ist Sekundärindex auf sehr hohe oder niedrige Kardinalität nicht effizient. Wie Sie sekundären Index auf Lesezeichen (Datentyp ist Text), aber wenn Wert nur "wahr" oder "falsch" ist, wird es nicht effizient sein. https://docs.datastax.com/en/cql/3.3/cql/cql_using/useWhenIndex.html

+0

Ich habe Follow-up Frage basierend auf Antwort. Wenn sekundäre Index niedrig ist (wie in meinem Fall), und Partition ist klein (~ 200-500 Zeilen), dann wird es auch ineffizient sein? – Darshan

+0

Es wird in Ihrem Fall nicht ineffizient sein. Wie Sie Partitionsschlüssel erwähnt haben und Sie haben diesen großen Datensatz nicht und Sie können es verwenden. – Chaity

Verwandte Themen