2009-12-22 15 views
7

Stavo solo lavorando su un'applicazione web e ho scoperto che la maggior parte delle tabelle mysql ha campi come is_live, can_do, required, published (e molti altri) con tipo di campo TINYINT e accetta solo 0 or 1. Mi stavo chiedendo se ho bisogno di creare indici su queste colonne mentre gli script usano join che includono anche queste colonne. Quindi domande sono:Devo creare indici su tipi di campi tinyint nelle tabelle mysql?

Devo aggiungere anche indici a queste colonne?

Devo cambiare il tipo in qualcos'altro?

Si prega di vedere questa domanda è più da fare con la comprensione del concetto piuttosto che risolvere un problema.

Grazie.

risposta

6

mio guru del database, dice, "non aggiungere qualsiasi indice se non si conosce la query". Nel tuo caso, sembra che tu conosca la query. Quindi sì, possiamo pensare all'indice. Se si dispone di un tipo di sistema di data warehouse, creare un indice bitmap. altrimenti non creare alcun indice. Gli indici B-tree sono negativi su colonne di cardinalità così piccole.

0

Dubito che questi campi vengano utilizzati in join poiché prendono 0 o 1 come input.

L'utilizzo principale di un indice in questo caso sarebbe la possibilità di recuperare i dati direttamente dall'indice, ma poiché l'indice sarebbe piuttosto ampio il sovraccarico molto probabilmente renderebbe questo inefficiente.

Tuttavia, l'unico approccio valido qui è provare il set di dati, poiché i dati che si stanno utilizzando possono avere un impatto significativo sul risultato.

0

Non penso che dovresti aggiungere indici a questi campi perché non contengono diversi e molti dati. Tuttavia, come per il tipo di campi, è possibile considerare il tipo enum.

+0

Che senso ha usare enum in questo caso? –

+0

@Peter, per i campi che dovrebbero avere un set fisso di valori come 0 o 1, è meglio o piuttosto convenzionale usare il tipo enum. – Sarfraz

+0

come su BOOL? Anche la cardinalità – user187580

-1

decidere se indicizzare o meno non dovrebbe dipendere dal tipo di dati, ma su

  • come spesso si cerca per il campo
  • quanti record della tabella avrà (ordine di grandezza)
  • sia in attesa per la query non indicizzato (scansione completa della tabella) è accettabile per l'utente
+0

conta e i tipi di dati implicano qualcosa sulla cardinalità della loro colonna. –

17

Il consiglio generale è che raramente un indice sul campo booleano sarà utile.

Gli indici B-tree sono più efficaci per dati di cardinalità elevata (cioè colonne con molti valori possibili, in cui i dati nella colonna sono univoci o quasi unici).

Alcuni motori di database, come Oracle e Postgres, supportano Bitmap Indexes. Gli indici bitmap sono stati tradizionalmente considerati validi per dati come il sesso (maschile o femminile), che ha un numero limitato di valori distinti, ma con molte occorrenze di tali valori.

MySQL al momento non supporta gli indici bitmap, ma potrebbe ottenere funzionalità simili utilizzando la funzione "index_merge". Gli indici bitmap dovrebbero essere introdotti con il motore Falcon (Source).

+0

vuoi dire dovrei passare a BOOL da TINYINT? – user187580

+0

No, non sarà di aiuto. –

+0

+1 per le informazioni sugli indici bitmap. Grazie, non lo sapevo. –