2015-04-22 10 views
13

Jestem nowy z Kasandra i napotkałem problem. Stworzyłem demodb przestrzeni kluczy i użytkowników tabel. Ta tabela ma 3 kolumny: id (int i primary key), firstname (varchar), name (varchar). to prośba o przesłanie mi dobry wynik:Cassandra, wybierz kluczem innym niż podstawowy

SELECT * FROM demodb.users WHERE id = 3; 

ale ten:

SELECT * FROM demodb.users WHERE firstname = 'francois'; 

nie działa i pojawia się następujący komunikat o błędzie:

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: " 

Wniosek ten również nie robi Działa:

SELECT * FROM users WHERE firstname = 'francois' ORDER BY id DESC LIMIT 5; 
InvalidRequest: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported." 

Z góry dziękuję.

Odpowiedz

12

Wniosek ten również nie działa:

to dlatego, że jesteś w mis-zrozumienie, jak porządek pracuje w Cassandry. Zamiast korzystać z indeksu wtórnego na firstname, utworzyć tabelę specjalnie dla tego zapytania, tak:

CREATE TABLE usersByFirstName (
    id int, 
    firstname text, 
    lastname text, 
    PRIMARY KEY (firstname,id)); 

Ta kwerenda powinny teraz działać:

SELECT * FROM usersByFirstName WHERE firstname='francois' 
ORDER BY id DESC LIMIT 5; 

uwaga, że ​​stworzyli związek klucz podstawowy na firstname i id. Spowoduje to podzielenie twoich danych na firstname (pozwalając ci na zapytanie przez nie), a także grupowanie twoich danych przez id. Domyślnie dane będą grupowane według id w porządku rosnącym. Aby zmienić to zachowanie, można określić CLUSTERING ORDER w wyciągu tworzenia tabeli:

WITH CLUSTERING ORDER BY (id DESC) 

... i wtedy nie będzie trzeba nawet klauzulę ORDER BY.

Niedawno napisałem artykuł o tym, jak działa porządek klastrowania w Cassandrze (We Shall Have Order). Wyjaśnia to i obejmuje również niektóre strategie zamawiania.

+0

Wielkie dzięki za te informacje – mel

5

Jest jedno ograniczenie w Kasandra: każde pole, którego chcesz użyć w klauzuli where, musi być kluczem podstawowym tabeli lub musi być na niej indeks wtórny. Musisz więc utworzyć indeks do imienia i dopiero potem możesz użyć imienia w warunku, w którym się znajdujesz, a otrzymasz wynik, którego oczekiwałeś.

+0

dla obu wniosków? – mel

+0

dla id, który podałeś klucz podstawowy, więc nie ma potrzeby. utwórz indeks tylko dla imienia. –

+1

Utworzono indeks dla imienia i teraz: SELECT * FROM demodb.users WHERE firstname = 'francois'; praca, ale ELEKTRONICZNE * OD UŻYTKOWNIKÓW GDZIE imię = "francois" ORDER BY id DESC LIMIT 5; nadal nie działa. – mel

Powiązane problemy