I migrated a project from django1.8 to django3.2. I'm using the same database but the function I use to build a report is four times slower (8 seconds on Django1.8 and 30/40 seconds with django3.2). The database is MySQL version 5.7 (I also tried version 8.0.32 but nothing changed).
This is the query:
qs = PartitaDanno.objects.filter(incarico__cliente_intestatario_fattura_id=8006
).select_related('incarico', 'anagrafica_assctp', 'incarico__naturaincarico'
).prefetch_related('rate'
).order_by('-incarico__anno', '-incarico__numero', 'pk')
PartitaDanno is a table with 16000 rows and the model has 215 fields (I know..I didn't write it). The result of this query are just 1700 rows..a very small result.
The unusual thing is that even if I use a simple query on this model like
qs = PartitaDanno.objects.filter(incarico__cliente_intestatario_fattura_id=8006)
It takes 20 seconds to iterate through result of this basic query..I don't understand.
The raw sql query is the same in both versions of Django. This is the first queryset raw query:
SELECT `sinistri_partitadanno`.`id`, `sinistri_partitadanno`.`created`, `sinistri_partitadanno`.`modified`, `sinistri_partitadanno`.`incarico_id`, `sinistri_partitadanno`.`tipo`, `sinistri_partitadanno`.`tipologia_controparte`, `sinistri_partitadanno`.`fase`, `sinistri_partitadanno`.`competenza_giurisdizionale`, `sinistri_partitadanno`.`soggetto`, `sinistri_partitadanno`.`anagrafica_assctp_id`, `sinistri_partitadanno`.`luogo`, `sinistri_partitadanno`.`compagnia_id`, `sinistri_partitadanno`.`riferimento_compagnia`, `sinistri_partitadanno`.`tipo_di_danno`, `sinistri_partitadanno`.`tipo_lesioni`, `sinistri_partitadanno`.`tipologia_vittima`, `sinistri_partitadanno`.`modello_veicolo`, `sinistri_partitadanno`.`targa_veicolo`, `sinistri_partitadanno`.`riserva_iniziale`, `sinistri_partitadanno`.`riserva_parziale`, `sinistri_partitadanno`.`data_richiesta_danni_ctp`, `sinistri_partitadanno`.`reiezione_cautelativa`, `sinistri_partitadanno`.`data_reiezione_cautelativa`, `sinistri_partitadanno`.`importo_richiesto_da_ctp`, `sinistri_partitadanno`.`data_incarico_nostro_perito`, `sinistri_partitadanno`.`tipologia_perizia`, `sinistri_partitadanno`.`nominativo_perito`, `sinistri_partitadanno`.`data_perizia_negativa`, `sinistri_partitadanno`.`motivazioni_perizia_negativa`, `sinistri_partitadanno`.`data_interlocutoria_inviata_dal_perito`, `sinistri_partitadanno`.`importo_stimato_dal_perito`, `sinistri_partitadanno`.`data_ricezione_perizia_dal_nostro_perito`, `sinistri_partitadanno`.`riparazione_antieconomica`, `sinistri_partitadanno`.`data_incarico_medico_legale`, `sinistri_partitadanno`.`data_ricezione_perizia_dal_nostro_medico_legale`, `sinistri_partitadanno`.`data_invio_offerta_tramite_transazione_quietanza`, `sinistri_partitadanno`.`data_reiezione_indennizzo_risarcimento`, `sinistri_partitadanno`.`pagamento_parziale`, `sinistri_partitadanno`.`capitale`, `sinistri_partitadanno`.`data_pagamento_capitale`, `sinistri_partitadanno`.`anagrafica_patrocinatore_id`, `sinistri_partitadanno`.`tipo_patrocinatore`, `sinistri_partitadanno`.`cf_piva_patrocinatore`, `sinistri_partitadanno`.`numero_rif_patrocinatore`, `sinistri_partitadanno`.`spese_legali`, `sinistri_partitadanno`.`data_pagamento_spese_legali`, `sinistri_partitadanno`.`integrazione_capitale`, `sinistri_partitadanno`.`data_pag_integraz_capitale`, `sinistri_partitadanno`.`integrazione_spese_legali`, `sinistri_partitadanno`.`data_pag_integraz_spese_legali`, `sinistri_partitadanno`.`note_generali`, `sinistri_partitadanno`.`note_pagamenti`, `sinistri_partitadanno`.`cessione_del_credito`, `sinistri_partitadanno`.`veicolo_sostitutivo`, `sinistri_partitadanno`.`importo_noleggio_veicolo_sostitutivo`, `sinistri_partitadanno`.`altre_spese_accessorie_richieste`, `sinistri_partitadanno`.`importo_altre_spese_accessorie_richieste`, `sinistri_partitadanno`.`importo_onorari_richiesti`, `sinistri_partitadanno`.`liquidazione_diretta_senza_perizia`, `sinistri_partitadanno`.`offerta_lesioni_a_stralcio`, `sinistri_partitadanno`.`richiesto_nulla_osta_giudice_tutelare`, `sinistri_partitadanno`.`data_ricezione_nulla_osta_giudice_tutelare`, `sinistri_partitadanno`.`note_fase_precontenziosa`, `sinistri_partitadanno`.`certificato_di_chiusura_malattia`, `sinistri_partitadanno`.`data_ricezione_cert_chiusura_malattia`, `sinistri_partitadanno`.`richiesta_accesso_agli_atti`, `sinistri_partitadanno`.`data_ricezione_richiesta_accesso_agli_atti`, `sinistri_partitadanno`.`data_risposta_accesso_agli_atti`, `sinistri_partitadanno`.`note_accesso_agli_atti`, `sinistri_partitadanno`.`atto_di_citazione`, `sinistri_partitadanno`.`data_notifica_atto_di_citazione`, `sinistri_partitadanno`.`valore_causa`, `sinistri_partitadanno`.`valore_giudiziale_riservato`, `sinistri_partitadanno`.`mediazione`, `sinistri_partitadanno`.`data_notifica_mediazione`, `sinistri_partitadanno`.`data_risposta_mediazione`, `sinistri_partitadanno`.`note_su_adr`, `sinistri_partitadanno`.`domiciliatario_sled_id`, `sinistri_partitadanno`.`autorita_evocata_id`, `sinistri_partitadanno`.`nome_del_giudice`, `sinistri_partitadanno`.`sezione_tribunale`, `sinistri_partitadanno`.`ruolo_generale`, `sinistri_partitadanno`.`prima_udienza_in_atto_introduttivo`, `sinistri_partitadanno`.`adempimento_udienza`, `sinistri_partitadanno`.`rinvio_all_udienza_del`, `sinistri_partitadanno`.`scadenza_adempimento`, `sinistri_partitadanno`.`tipologia_adempimento`, `sinistri_partitadanno`.`numero_sentenza`, `sinistri_partitadanno`.`data_ricezione_sentenza`, `sinistri_partitadanno`.`pubblicazione_sentenza`, `sinistri_partitadanno`.`data_prima_udienza`, `sinistri_partitadanno`.`note`, `sinistri_partitadanno`.`adempimento_svolto`, `sinistri_partitadanno`.`reclamo_ivass`, `sinistri_partitadanno`.`data_ricezione_reclamo_ivass`, `sinistri_partitadanno`.`studio_legale_incaricato`, `sinistri_partitadanno`.`dettaglio_riserva_rivalsa`, `sinistri_partitadanno`.`dettaglio_esborsi_pagati_sled`, `sinistri_partitadanno`.`descrizione_esborsi_pagati_sled`, `sinistri_partitadanno`.`dettaglio_importi_recuperati_da_sled`, `sinistri_partitadanno`.`ricevuta_richiesta_danni_ctp`, `sinistri_partitadanno`.`data_ricezione_richiesta_danni_ctp`, `sinistri_partitadanno`.`termini_legali_di_risposta_ctp`, `sinistri_partitadanno`.`motivi_reiezione_cautelativa`, `sinistri_partitadanno`.`data_integraz_elementi_ctp`, `sinistri_partitadanno`.`data_ricezione_transazione_quietanza_firmata`, `sinistri_partitadanno`.`data_ricezione_rifiuto_offerta`, `sinistri_partitadanno`.`motivi_reiezione_indennizzo`, `sinistri_partitadanno`.`clausole_particolari`, `sinistri_partitadanno`.`incarico_gestione_relitto`, `sinistri_partitadanno`.`destinazione_relitto`, `sinistri_partitadanno`.`data_ricezione_incarico`, `sinistri_partitadanno`.`valore_commerciale`, `sinistri_partitadanno`.`spese_diverse_relitto`, `sinistri_partitadanno`.`tipologia_spesa_relitto`, `sinistri_partitadanno`.`importo_vendita`, `sinistri_partitadanno`.`data_bonifico`, `sinistri_partitadanno`.`acquirente`, `sinistri_partitadanno`.`data_voltura_demolizione`, `sinistri_partitadanno`.`note_gestione_relitti`, `sinistri_partitadanno`.`data_ricezione_citazione`, `sinistri_partitadanno`.`data_richiesta_pagamento_bo`, `sinistri_partitadanno`.`stato_chiusura`, `sinistri_partitadanno`.`tipo_chiusura_con_pagamento`, `sinistri_partitadanno`.`tipo_chiusura_senza_seguito`, `sinistri_partitadanno`.`tipo_chiusura_con_recupero`, `sinistri_partitadanno`.`data_apertura`, `sinistri_partitadanno`.`data_chiusura`, `sinistri_partitadanno`.`data_riapertura`, `sinistri_partitadanno`.`anagrafica_cessionario_id`, `sinistri_partitadanno`.`minore`, `sinistri_partitadanno`.`anag_esercente_potesta_id`, `sinistri_partitadanno`.`anagrafica_erede_id`, `sinistri_partitadanno`.`investigazione_antifrode`, `sinistri_partitadanno`.`data_appuntamento_perito`, `sinistri_partitadanno`.`data_ricezione_doc_completi`, `sinistri_partitadanno`.`data_incarico_agenzia_pa`, `sinistri_partitadanno`.`data_ricezione_doc_da_agenzia_pa`, `sinistri_partitadanno`.`veicolo_in_deposito`, `sinistri_partitadanno`.`veicolo_sotto_sequestro`, `sinistri_partitadanno`.`data_dissequestro`, `sinistri_partitadanno`.`data_invio_offerta_vendita`, `sinistri_partitadanno`.`tipologia_perizia_medica`, `sinistri_partitadanno`.`nominativo_medico`, `sinistri_partitadanno`.`data_appuntamento`, `sinistri_partitadanno`.`data_interlocutoria_medica`, `sinistri_partitadanno`.`data_perizia_medica_negativa`, `sinistri_partitadanno`.`motivazioni_perizia_medica_negativa`, `sinistri_partitadanno`.`tassa_di_registro`, `sinistri_partitadanno`.`data_pagamento_tassa_di_registro`, `sinistri_partitadanno`.`negoziazione_assistita`, `sinistri_partitadanno`.`causa_penale`, `sinistri_partitadanno`.`data_prossima_udienza`, `sinistri_partitadanno`.`note_causa_penale`, `sinistri_partitadanno`.`decreto_ingiuntivo`, `sinistri_partitadanno`.`tipologia_rito`, `sinistri_partitadanno`.`fase_procedura`, `sinistri_partitadanno`.`conclusione`, `sinistri_partitadanno`.`numero_di_polizza`, `sinistri_partitadanno`.`conducente`, `sinistri_partitadanno`.`anagrafica_conducente_id`, `sinistri_partitadanno`.`estratti_autentici`, `sinistri_partitadanno`.`nome_notaio`, `sinistri_partitadanno`.`data_autentica`, `sinistri_partitadanno`.`data_invio_messa_in_mora`, `sinistri_partitadanno`.`data_ricezione_messa_in_mora`, `sinistri_partitadanno`.`data_notifica_titolo_giudiziale`, `sinistri_partitadanno`.`atto_di_precetto`, `sinistri_partitadanno`.`data_notifica_precetto`, `sinistri_partitadanno`.`somme_incassate`, `sinistri_partitadanno`.`data_incasso`, `sinistri_partitadanno`.`n_decreto_ingiuntivo`, `sinistri_partitadanno`.`r_g_decreto_ingiuntivo`, `sinistri_partitadanno`.`data_emissione_decreto_ingiuntivo`, `sinistri_partitadanno`.`data_notifica_decreto_ingiuntivo`, `sinistri_partitadanno`.`capitale_liquidato_decreto_ingiuntivo`, `sinistri_partitadanno`.`onorari_liquidati_decreto_ingiuntivo`, `sinistri_partitadanno`.`data_apposizione_formula_esecutiva`, `sinistri_partitadanno`.`importo_atto_di_precetto`, `sinistri_partitadanno`.`data_notifica_precetto_rinnovazione`, `sinistri_partitadanno`.`data_notifica_pignoramento_mobiliare`, `sinistri_partitadanno`.`rge_pignoramento_mobiliare`, `sinistri_partitadanno`.`data_notifica_pignoramento_presso_terzi`, `sinistri_partitadanno`.`iscrizione_ruolo_pignoramento_presso_terzi`, `sinistri_partitadanno`.`rge_pignoramento_presso_terzi`, `sinistri_partitadanno`.`data_notifica_pignoramento_immobiliare`, `sinistri_partitadanno`.`iscrizione_ruolo_pignoramento_immobiliare`, `sinistri_partitadanno`.`rge_pignoramento_immobiliare`, `sinistri_partitadanno`.`data_trascrizione_pignoramento_immobiliare`, `sinistri_partitadanno`.`anagrafica_amministratore_id`, `sinistri_partitadanno`.`progressivo_uci_ctp`, `sinistri_partitadanno`.`codice_servizio`, `sinistri_partitadanno`.`lotto_affidato`, `sinistri_partitadanno`.`importo_affidato`, `sinistri_partitadanno`.`capitale_azionato`, `sinistri_partitadanno`.`calc_capitale_azionato`, `sinistri_partitadanno`.`note_recupero_crediti`, `sinistri_partitadanno`.`note_status`, `sinistri_partitadanno`.`note_gestione`, `sinistri_incarico`.`id`, `sinistri_incarico`.`created`, `sinistri_incarico`.`modified`, `sinistri_incarico`.`ufficio_sled`, `sinistri_incarico`.`natura_incarico`, `sinistri_incarico`.`naturaincarico_id`, `sinistri_incarico`.`progetto_id`, `sinistri_incarico`.`status`, `sinistri_incarico`.`data_chiusura_incarico`, `sinistri_incarico`.`numero`, `sinistri_incarico`.`anno`, `sinistri_incarico`.`numero_incarico_sled`, `sinistri_incarico`.`avvocato_incaricato_id`, `sinistri_incarico`.`data_affidamento_avvocato`, `sinistri_incarico`.`cliente_intestatario_fattura_id`, `sinistri_incarico`.`fronter_cliente`, `sinistri_incarico`.`intermediario_id`, `sinistri_incarico`.`numero_incarico_cliente`, `sinistri_incarico`.`locatario_id`, `sinistri_incarico`.`numero_di_polizza`, `sinistri_incarico`.`codice_evento`, `sinistri_incarico`.`tipologia_sinistro`, `sinistri_incarico`.`riserva_totale`, `sinistri_incarico`.`onorari_ed_anticipazioni_sled`, `sinistri_incarico`.`data_fattura_onorari_ed_anticipazioni_sled`, `sinistri_incarico`.`numero_fattura_sled`, `sinistri_incarico`.`data_incasso_onorari_ed_anticipazioni_sled`, `sinistri_incarico`.`totale_pagato_come_risarcimento`, `sinistri_incarico`.`totale_onorari_ed_anticipazioni_pagati_a_sled`, `sinistri_incarico`.`totale_importi_recuperati_da_sled`, `sinistri_incarico`.`costo_totale_del_sinistro`, `sinistri_incarico`.`data_ricezione_fondi`, `sinistri_incarico`.`data_del_sinistro`, `sinistri_incarico`.`ora_del_sinistro`, `sinistri_incarico`.`luogo_del_sinistro`, `sinistri_incarico`.`stato`, `sinistri_incarico`.`data_ricezione_incarico_sled`, `sinistri_incarico`.`data_apertura_incarico_sled`, `sinistri_incarico`.`data_riapertura_incarico_sled`, `sinistri_incarico`.`targa_veicolo_assicurato`, `sinistri_incarico`.`assicurato`, `sinistri_incarico`.`proprietario`, `sinistri_incarico`.`nome_conducente`, `sinistri_incarico`.`cognome_conducente`, `sinistri_incarico`.`modello_veicolo`, `sinistri_incarico`.`blackbox`, `sinistri_incarico`.`data_installazione_blackbox`, `sinistri_incarico`.`cai_2f`, `sinistri_incarico`.`data_ricezione_cai_2f`, `sinistri_incarico`.`autorita_intervenuta`, `sinistri_incarico`.`verbale_autorita`, `sinistri_incarico`.`data_ricezione_verbale_autorita`, `sinistri_incarico`.`testimonianza`, `sinistri_incarico`.`nome_testimone`, `sinistri_incarico`.`testimone_id`, `sinistri_incarico`.`data_ricezione_testimonianza`, `sinistri_incarico`.`denuncia_di_sinistro`, `sinistri_incarico`.`data_ricezione_denuncia_sx`, `sinistri_incarico`.`franchigia_si_no`, `sinistri_incarico`.`importo_franchigia`, `sinistri_incarico`.`data_richiesta_copertura`, `sinistri_incarico`.`esito_copertura`, `sinistri_incarico`.`data_inizio_copertura`, `sinistri_incarico`.`data_fine_copertura`, `sinistri_incarico`.`note_sulla_copertura`, `sinistri_incarico`.`garanzia`, `sinistri_incarico`.`pagamento_totale_del_sinistro`, `sinistri_incarico`.`sinistro_con_lesioni_personali_gravi_o_gravissime`, `sinistri_incarico`.`sinistro_mortale`, `sinistri_incarico`.`liq_cliente_incaricato`, `sinistri_incarico`.`scoperto`, `sinistri_incarico`.`limite_di_indennizzo`, `sinistri_incarico`.`esclusioni_di_polizza`, `sinistri_incarico`.`note_aggiuntive`, `sinistri_incarico`.`importo_da_recuperare`, `sinistri_incarico`.`calc_importo_da_recuperare`, `sinistri_incarico`.`importo_prescritto`, `sinistri_incarico`.`fermo_tecnico`, `sinistri_incarico`.`tutela_legale`, `sinistri_incarico`.`compagnia_tutela_legale_id`, `sinistri_incarico`.`data_effetto_polizza`, `sinistri_incarico`.`data_scadenza_polizza`, `sinistri_incarico`.`data_pagamento_premio`, `sinistri_incarico`.`codice_agenzia`, `sinistri_incarico`.`onorari`, `sinistri_incarico`.`pratica_procurata_da_id`, `sinistri_incarico`.`rif_uci`, `sinistri_incarico`.`liquidatore_uci`, `sinistri_incarico`.`rif_consap`, `sinistri_incarico`.`branding`, `sinistri_naturaincarico`.`id`, `sinistri_naturaincarico`.`label`, `sinistri_naturaincarico`.`codice_fatturazione`, `sinistri_naturaincarico`.`tipo_workflow`, T5.`id`, T5.`created`, T5.`modified`, T5.`tipo`, T5.`denominazione_giuridica`, T5.`titolo`, T5.`cognome_ragione_sociale`, T5.`nome`, T5.`rappr_sinistro_in_italia`, T5.`indirizzo`, T5.`citta`, T5.`provincia`, T5.`cap`, T5.`telefono`, T5.`fax`, T5.`cellulare`, T5.`email`, T5.`pec`, T5.`codice_fiscale`, T5.`partita_iva`, T5.`professione`, T5.`luogo_di_nascita`, T5.`data_di_nascita`, T5.`sesso`, T5.`codice_iban`, T5.`note`, T5.`blacklist`, T5.`tempi_pagamento`, T5.`codice_fatturazione`, T5.`naturacosto_id`, T5.`nazione`, T5.`codice_uci`, T5.`importata_da_xml` FROM `sinistri_partitadanno` INNER JOIN `sinistri_incarico` ON (`sinistri_partitadanno`.`incarico_id` = `sinistri_incarico`.`id`) LEFT OUTER JOIN `sinistri_naturaincarico` ON (`sinistri_incarico`.`naturaincarico_id` = `sinistri_naturaincarico`.`id`) LEFT OUTER JOIN `sinistri_anagrafica` T5 ON (`sinistri_partitadanno`.`anagrafica_assctp_id` = T5.`id`) WHERE `sinistri_incarico`.`cliente_intestatario_fattura_id` = 8006 ORDER BY `sinistri_incarico`.`anno` DESC, `sinistri_incarico`.`numero` DESC, `sinistri_partitadanno`.`id` ASC
This is the result of queryset.explain():
-> Sort row IDs: sinistri_incarico.anno DESC, sinistri_incarico.numero DESC, sinistri_partitadanno.id (actual time=163.955..172.010 rows=1761 loops=1)
-> Table scan on <temporary> (cost=2518.91..2544.83 rows=1874) (actual time=153.040..163.135 rows=1761 loops=1)
-> Temporary table (cost=2518.90..2518.90 rows=1874) (actual time=153.007..153.007 rows=1761 loops=1)
-> Nested loop left join (cost=2331.46 rows=1874) (actual time=0.247..62.163 rows=1761 loops=1)
-> Nested loop inner join (cost=1675.43 rows=1874) (actual time=0.224..52.547 rows=1761 loops=1)
-> Nested loop left join (cost=1019.40 rows=1677) (actual time=0.089..17.068 rows=1677 loops=1)
-> Index lookup on sinistri_incarico using b842d1d4b6d5fa98d8dc06d2c92e02c5 (cliente_intestatario_fattura_id=8006) (cost=432.45 rows=1677) (actual time=0.081..15.586 rows=1677 loops=1)
-> Single-row index lookup on sinistri_naturaincarico using PRIMARY (id=sinistri_incarico.naturaincarico_id) (cost=0.25 rows=1) (actual time=0.001..0.001 rows=1 loops=1677)
-> Index lookup on sinistri_partitadanno using sinistri_pa_incarico_id_398e55f0a3d8c2c0_fk_sinistri_incarico_id (incarico_id=sinistri_incarico.id) (cost=0.28 rows=1) (actual time=0.018..0.021 rows=1 loops=1677)
-> Single-row index lookup on T5 using PRIMARY (id=sinistri_partitadanno.anagrafica_assctp_id) (cost=0.25 rows=1) (actual time=0.005..0.005 rows=1 loops=1761)
Of course it slow down when I start iterating the queryset with a for loop. I don't use iterator() on the complex query because I'm using prefetch_related.
--- First Edit ---
This is the result for raw query in phpmyadmin. It's really fast (3.5 seconds to make the query and build the table with results)
Thanks for your help!
Here's the code I used to create the table:
CREATE TABLE test.packages (
packageuuid timeuuid,
ruserid text,
suserid text,
timestamp int,
PRIMARY KEY (ruserid, suserid, packageuuid, timestamp)
);
and then I create a materialized view:
CREATE MATERIALIZED VIEW test.packages_by_userid
AS SELECT * FROM test.packages
WHERE ruserid IS NOT NULL
AND suserid IS NOT NULL
AND TIMESTAMP IS NOT NULL
AND packageuuid IS NOT NULL
PRIMARY KEY (ruserid, suserid, timestamp, packageuuid)
WITH CLUSTERING ORDER BY (packageuuid DESC);
I want to be able to search for packages sent between two IDs
so I would need something like this:
SELECT * FROM test.packages_by_userid WHERE (ruserid = '1' AND suserid = '2' AND suserid = '1' AND ruserid = '2') AND timestamp > 1496601553;
How would I accomplish something like this with CQL?
I've searched a bit but I can't figure it out.
I'm willing to change the structure of the table if it will make something like this possible.
If it's doable without a materialized view that would also be good.
Use In Clause:
SELECT * FROM test.packages_by_userid WHERE ruserid IN ( '1', '2') AND suserid IN ( '1','2') AND timestamp > 1496601553;
Note : Keep the in clause size smaller, Large in clause in the partition can cause GC pauses and heap pressure that leads to overall slower performance
In practical terms this means you’re waiting on this single coordinator node to give you a response, it’s keeping all those queries and their responses in the heap, and if one of those queries fails, or the coordinator fails, you have to retry the whole thing.
If the multiple partition in clause larger try to use separate query, for each partition (ruserid) with executeAsync.
SELECT * FROM test.packages_by_userid WHERE ruserid = '1' AND suserid IN ( '1','2') AND timestamp > 1496601553;
SELECT * FROM test.packages_by_userid WHERE ruserid = '2' AND suserid IN ( '1','2') AND timestamp > 1496601553;
Learn More : https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/
Since you always search for both sender and receiver, I'd model this with the following table layout:
CREATE TABLE test.packages (
ruserid text,
suserid text,
timestamp int,
packageuuid timeuuid,
PRIMARY KEY ((ruserid, suserid), timestamp)
);
In this way, for each pair of sender/receiver you need to run two queries, one for each partition:
SELECT * FROM packages WHERE ruserid=1 AND suserid=2 AND timestamp > 1496601553;
SELECT * FROM packages WHERE ruserid=2 AND suserid=1 AND timestamp > 1496601553;
This is IMHO the best solution because, remember, in Cassandra you start from your queries and build your table models on that, never the reverse.