Proprio per conferire un po 'di comprensione. ..
Come per tutti i problemi di interrogazione di Cassandra, la query deve essere servita da un modello appositamente progettato per esso. Questo è noto come modellazione basata su query. Interrogare l'ultima riga inserita non è una capacità intrinseca incorporata in ogni tabella. Dovresti progettare il tuo modello per supportarlo in anticipo.
Ad esempio, supponiamo di avere una tabella che memorizza i dati per gli utenti.
CREATE TABLE users (
username TEXT,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username));
Se dovessi correre un SELECT * FROM users LIMIT 1
su questo tavolo, il mio set di risultati conterrebbe una singola riga. Quella riga sarebbe quella contenente il valore hash più basso di username
(la mia chiave di partizione), perché è così che Cassandra memorizza i dati nel cluster. Non avrei modo di sapere se è stato aggiunto o meno l'ultimo, quindi questo non sarebbe terribilmente utile per te.
D'altra parte, diciamo che avevo una tabella progettata per tenere traccia degli aggiornamenti che gli utenti avevano fatto alle loro informazioni sull'account.
CREATE TABLE userUpdates (
username TEXT,
lastUpdated TIMEUUID,
email TEXT,
firstname TEXT,
lastname TEXT,
PRIMARY KEY (username,lastUpdated))
WITH CLUSTERING ORDER BY (lastUpdated DESC);
successiva sarò upsert 3 righe:
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('bkerman',now(),'[email protected]','Bob','Kerman');
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('jkerman',now(),'[email protected]','Jebediah','Kerman');
> INSERT INTO userUpdates (username,lastUpdated,email,firstname,lastname)
VALUES ('bkerman',now(),'[email protected]','Bob','Kerman');
> SELECT username, email, dateof(lastUpdated) FROM userupdates;
username | email | system.dateof(lastupdated)
----------+-------------------+----------------------------
jkerman | [email protected] | 2016-02-17 15:31:39+0000
bkerman | [email protected] | 2016-02-17 15:32:22+0000
bkerman | [email protected] | 2016-02-17 15:31:38+0000
(3 rows)
Se ho appena SELECT username, email, dateof(lastUpdated) FROM userupdates LIMIT 1
avrò i dati di Jedediah Kerman, che non è il più recentemente aggiornato. Tuttavia, se limito la mia partizione a username='bkerman'
, con uno LIMIT 1
otterrò la riga più recente per Bob Kerman.
> SELECT username, email, dateof(lastUpdated) FROM userupdates WHERE username='bkerman' LIMIT 1;
username | email | system.dateof(lastupdated)
----------+-------------------+----------------------------
bkerman | [email protected] | 2016-02-17 15:32:22+0000
(1 rows)
Questo funziona, perché ho specificato un ordine raggruppamento di decrescente su lastUpdated
:
WITH CLUSTERING ORDER BY (lastUpdated DESC);
In questo modo, i risultati all'interno di ogni partizione verrà restituito alla fila più di recente upserted al in alto, quindi LIMIT 1
diventa il modo di interrogare la riga più recente.
In sintesi, è importante capire che:
- Cassandra ordini dati del cluster per il valore hash di una chiave di partizione. Questo aiuta a garantire una distribuzione dei dati più uniforme.
- Cassandra
CLUSTERING ORDER
impone l'ordinamento dei dati su disco all'interno di una chiave di partizione.
- Mentre non è possibile ottenere la riga più recente modificata per ogni tabella, è possibile aggiungere modelli di progettazione per ciascuna riga .
tl; dr; Le interrogazioni in Cassandra sono MOLTO diverse da quelle di MySQL o di qualsiasi RDBMS. Se l'interrogazione sull'ultima riga modificata (per una partizione) è qualcosa che devi fare, ci sono probabilmente dei modi in cui puoi modellare la tabella per supportarla.
In qualsiasi ambiente con cluster, è praticamente impossibile determinare l'ultima voce inserita. Cassandra non fa eccezione. –
Per le persone di Cassandra: il concetto di "ultima riga inserita" in MySQL è in realtà l'id (autoincrement) della riga che è stata appena inserita dal client tramite un'istruzione INSERT. Questo è un vero problema in Cassandra se, ad esempio, la tua chiave primaria è un 'timeuuid' e usi la funzione' now() 'per produrre automaticamente il valore per la nuova riga. Non c'è apparentemente alcun modo per determinare il timeuuid della nuova riga anche se sembra una cosa facile da aggiungere al driver. – Shannon