paolo@bimodesign.com | +34 608 61 64 10

DB Relational

        

MySQL e la cardinalita'

La cardinalita' misura quante unique rows ci sono in un index
E' valutata su valori statistici interi, e quindi non necessariamente esatti, sopratutto nel caso di piccole tabelle.
Un valore di cardinalita' alto, indica migliori performance in lettura, perche' ha meno records da leggere, e quindi piu' possibilita' che MySQL usi l'indice quando esegue JOINS

Per aggiornare questa statistica, si deve eseguire l'Analyze Table o il comando MyIsamchk -a.

Quando ha senso creare un indice su una low cardinality?
Ad esempio se abbiamo un campo che contiene un valore booleano (false/true), e quindi pochi valori diversi (totRows/2), ha senso creare un indice?
Come sempre i test e l'explain plan ci aiutano a capire se sia necessario crearlo ed, in generale, un indice su un low cardinality, torna utile nei seguenti casi
1) Quando uno dei possibili valori, su cui effettuiamo la ricerca, e' molto frequente rispetto agli altri valori.
Se ad esempio cerchiamo tra i colori degli occhi (blu,verde,marrone) quelli marroni, ha senso creare un indice anche se la cardinalita' e' bassa

SELECT  *
FROM    aspetto-fisico
WHERE   colore-occhi = 'marrone'


2) Quando i valori tendono ad essere raggruppati secondo l'ordine di inserimento in tabella (una data per esempio).

SELECT  *
FROM    records_dal_2010
WHERE   year = 2012
LIMIT 1

In questo caso, anche se il numero di valori diversi del campo anno e' uguale 3 (low cardinality), ma visto che e' piu' probabile che vengano aggiunti dati per l'anno in corso, se non creiamo un indice, MySQL ritardera' nell' estrarre dati dell'anno in corso, perche' comunque deve scorrere sempre tutte le righe della tabella.
3) Quando usiamo un ORDER BY o un LIMIT

SELECT  *
FROM    people
ORDER BY sesso, id
LIMIT 1

In questo caso se non creiamo un indice, MySQL dovrebbe eseguire un file sort e quindi un FULL SCAN, anche se abbiamo inserito la clausola LIMIT 1
4. Quando si esegue una distinct (ovvero una group by).
Riprendendo l'esempio del colore degli occhi, la creazione dell'indice sul campo colore, anche se abbiamo solo 3 tipi diversi, e' una buona scelta.

SELECT  DISTINCT color
FROM    aspetto-fisico.