Zunächst einmal ist die Verwendung der ALLOW FILTERING
Direktive schrecklich ineffizient, und ihre Verwendung wird als ein Anti-Pattern betrachtet. Wenn Sie feststellen müssen, dass Sie es verwenden müssen, um eine Abfrageanforderung zu erfüllen, sollten Sie stattdessen eine neue Tabelle erstellen, die besser zu Ihrer Abfrage passt. Vielleicht eine, die Ihre Partitionsschlüssel besser für den Datenabruf nutzt. nur
select * from implication
where "toIP" <= 3065377522 and "fromIP" >= 3065377522 ALLOW FILTERING;
Dies schlägt fehl, weil Cassandra verwenden nicht gleich Bedingungen (> =>, <, < =) auf einer einzigen Spalte, und es hat die letzte sein.
select * from implication
where "toIP" <= 3065377522 ALLOW FILTERING;
Dies schlägt mit der gleichen Fehlermeldung fehl, weil es erkennt, dass Sie aktiv versuchen, Cassandra davon abzuhalten, das zu tun, was es am besten kann. Und das ist eine einzelne Zeile oder ein zusammenhängender Bereich von geordneten Reihen von der Festplatte gelesen. Im Wesentlichen fordern Sie es auf, zufällige Lesevorgänge auszuführen, da es jeden Knoten in Ihrem Cluster überprüfen muss, um diese Abfrage zu erfüllen. Da Cassandra so konzipiert ist, dass es großräumig unterstützt wird, könnte dies viel Zeit für das Netzwerk in Ihre Abfrage-Gleichung einbringen ... etwas, vor dem es Sie zu retten versucht.
Um dieses Problem zu lösen, würde ich die Tabelle mit einem entsprechenden Partitionsschlüssel (wie oben erwähnt) eine einzelne IP-Adresse Spalte und eine von/zu Spalte ... alles ein Teil des Schlüssels. Es würde wie folgt aussehen:
CREATE TABLE iplocation (
idIPLocation uuid,
IP bigint,
fromTo text,
idCity uuid,
idCountry uuid,
idProvince uuid,
isActive boolean,
PRIMARY KEY (idIPLocation, IP, fromTo)
);
Jetzt im Wesentlichen Sie Ihre Daten speichern, zweimal, Sie einen Start geben und IP-Bereich endet. Die Zeilen werden durch einen F
oder T
als Clustering-Schlüssel unterschieden, um Ihnen zu sagen, welche die "Von IP" ist und welche die "Zu IP" ist.
[email protected]:stackoverflow> SELECT * FROm implication
WHERE idiplocation=76080f76-92f7-4d25-a531-a44c38ff38a7
AND IP>=10000 AND IP<=3065377522;
idiplocation | ip | fromto | idcity | idcountry | idprovince | isactive
--------------------------------------+----------+--------+--------------------------------------+--------------------------------------+--------------------------------------+----------
76080f76-92f7-4d25-a531-a44c38ff38a7 | 10001 | F | 6921a08b-c156-428e-8d4f-b371ff13f073 | f33bd5ed-b9b3-419b-99ab-ac2a7c87ba55 | 5a13cfcc-382e-418a-aeae-309f43671336 | True
76080f76-92f7-4d25-a531-a44c38ff38a7 | 10480101 | T | 6921a08b-c156-428e-8d4f-b371ff13f073 | f33bd5ed-b9b3-419b-99ab-ac2a7c87ba55 | 5a13cfcc-382e-418a-aeae-309f43671336 | True
(2 rows)
Dies ist ähnlich, wie ich Probleme modellieren, wo Datenpunkte haben eine Reihe von sowohl einer Start- und Endzeit an. Während Ihre Endlösung wahrscheinlich anders sein wird, ist der Modellierungsmechanismus hier etwas, das für Sie funktionieren könnte.
danke für diese detaillierte beantwortet, aber ich habe keine idiplocation ich nur beschränken, ip zu verwenden, um jede lösung zu suchen? – maq