select * from update_audit where scopeid=35 and formid=78005 and record_link_id=9897;
cum interogarea de mai sus va funcționa intern în cassandra?
în esență, toate datele pentru partiția scopeid=35
și formid=78005
vor fi returnate și apoi filtrate de indexul record_link_id
. Va căuta intrarea record_link_id
pentru 9897
și va încerca să potrivească intrările care se potrivesc cu rândurile returnate unde scopeid=35
și formid=78005
. Intersecția rândurilor pentru tastele de partiție și tastele index va fi returnată.
cât de mare-cardinality coloana (record_link_id)index va afecta performanța de interogare pentru interogarea de mai sus?
indicii de înaltă cardinalitate creează în esență un rând pentru (aproape) fiecare intrare din tabelul principal. Performanța este afectată, deoarece Cassandra este concepută pentru a efectua citiri secvențiale pentru rezultatele interogării. O interogare index o obligă în esență pe Cassandra să efectueze citiri aleatorii. Pe măsură ce cardinalitatea valorii indexate crește, la fel și timpul necesar pentru a găsi valoarea interogată.
cassandra va atinge toate nodurile pentru interogarea de mai sus? De ce?
nr. Ar trebui să atingă doar un nod care este responsabil pentru partiția scopeid=35
și formid=78005
. Indici, de asemenea, sunt stocate local, conțin numai intrări care sunt valabile pentru nodul local.
crearea indexului peste coloanele cu cardinalitate ridicată va fi cel mai rapid și mai bun model de date
problema aici este că abordarea nu se scalează și va fi lentă dacăupdate_audit
este un set de date mare. MVP Richard Low are un articol excelent despre indicii secundari( locul dulce pentru indexarea secundară Cassandra) și, în special, despre acest punct:
dacă tabelul dvs. ar fi semnificativ mai mare decât memoria, o interogare ar fi foarte lentă chiar și pentru a returna doar câteva mii de rezultate. Returnarea potențial milioane de utilizatori ar fi dezastruoasă, chiar dacă ar părea a fi o interogare eficientă.
în practică, aceasta înseamnă că indexarea este cea mai utilă pentru returnarea a zeci, poate sute de rezultate. Țineți cont de acest lucru atunci când luați în considerare utilizarea unui index secundar.
acum, abordarea dvs. de restricționare a unei anumite partiții vă va ajuta (deoarece partiția dvs. ar trebui să se încadreze cu siguranță în memorie). Dar simt că alegerea mai bună aici ar fi să facem record_link_id
o cheie de grupare, în loc să ne bazăm pe un index secundar.
Edit
cum are indexul pe indicele cardinalității scăzut atunci când există milioane de utilizatori la scară chiar și atunci când oferim cheia primară
va depinde de cât de largi sunt rândurile dvs. Lucru complicat despre indici cardinality extrem de mici, este că % din rânduri returnate este de obicei mai mare. De exemplu, luați în considerare un rând larg users
tabel. Restricționați prin cheia de partiție din interogarea dvs., dar există încă 10.000 de rânduri returnate. Dacă indexul dvs. este pe ceva de genulgender
, interogarea dvs. va trebui să filtreze aproximativ jumătate din acele rânduri, care nu vor funcționa bine.
indicii secundari tind să funcționeze cel mai bine pe (din lipsa unei descrieri mai bune) cardinalitatea „mijlocul drumului”. Folosind exemplul de mai sus al unui rând larg users
tabel, un index pe country
sau state
ar trebui să funcționeze mult mai bine decât un index pe gender
(presupunând că majoritatea acestor utilizatori nu trăiesc toți în aceeași țară sau stat).
Edit 20180913
pentru răspunsul dvs. la întrebarea 1 „Cum interogarea de mai sus va funcționa intern în cassandra?”, știi ce este comportamentul atunci când interogare cu paginare?
luați în considerare următoarea diagramă, preluată din documentația driverului Java (v3.6):
practic, paginarea va determina interogarea să se descompună și să revină la cluster pentru următoarea iterație a rezultatelor. Ar fi mai puțin probabil să timeout, dar performanța va tendință descendentă, proporțională cu dimensiunea setului total de rezultate și numărul de noduri din cluster.
TL;DR; rezultatele mai solicitate se răspândesc pe mai multe noduri, cu atât va dura mai mult.