Sollte ich Indizes für tinyint Feldtypen in mysql Tabellen erstellen?

7

Ich habe gerade an einer Webanwendung gearbeitet und festgestellt, dass die mysql -Tabellen am meisten Felder wie is_live, can_do, required, published (und viele mehr) mit dem Feldtyp TINYINT haben und nur 0 or 1 verwenden. Ich habe mich nur gefragt, ob ich Indizes für diese Spalten erstellen muss, da Skripte Joins verwenden, die auch diese Spalten enthalten. Fragen sind also:

Sollte ich diesen Spalten auch Indizes hinzufügen?

Sollte ich den Typ auf etwas anderes ändern?

Bitte sehen Sie, dass diese Frage mehr damit zu tun hat, das Konzept zu verstehen als ein Problem zu lösen.

Danke.

    
user187580 22.12.2009, 12:01
quelle

5 Antworten

6

Mein Datenbank-Guru sagt: "Fügen Sie niemals einen Index hinzu, wenn Sie die Abfrage nicht kennen". In Ihrem Fall sieht es so aus, als ob Sie die Abfrage kennen. Also ja, wir können über Index nachdenken. Wenn Sie ein System vom Typ Data Warehouse haben, erstellen Sie einen Bitmap-Index. Andernfalls erstellen Sie keinen Index. B-Tree-Indizes sind in solchen kleinen Kardinalspalten schlecht.

    
Shamik 22.12.2009, 12:09
quelle
17

Der allgemeine Hinweis lautet, dass ein Index für boolesche Felder selten nützlich sein wird.

B-Tree-Indizes sind am effektivsten für Daten mit hoher Kardinalität (d. h. Spalten mit vielen möglichen Werten, wobei die Daten in der Spalte eindeutig oder fast eindeutig sind).

Einige Datenbank-Engines, wie Oracle und Postgres, unterstützen Bitmap-Indizes . Bitmap-Indizes wurden traditionell als gut für Daten wie Geschlecht (männlich oder weiblich), die eine kleine Anzahl von verschiedenen Werten, aber mit vielen Vorkommen dieser Werte hat, angesehen.

MySQL unterstützt derzeit keine Bitmap-Indizes, kann jedoch ähnliche Funktionen mit der Funktion "index_merge" erreichen. Bitmap-Indizes sollten mit der Falcon-Engine ( Quelle ) eingeführt werden.

    
Daniel Vassallo 22.12.2009 12:10
quelle
0

Ich bezweifle, dass diese Felder in Joins verwendet werden, da sie 0 oder 1 als Eingabe annehmen.

Die primäre Verwendung eines Index in diesem Fall wäre die Möglichkeit, die Daten direkt aus dem Index abzurufen, aber da der Index ziemlich groß wäre, würde der Overhead dies höchstwahrscheinlich unwirksam machen.

Allerdings ist der einzige gültige Ansatz hier, Ihren Datensatz zu testen, da die von Ihnen verwendeten Daten einen erheblichen Einfluss auf das Ergebnis haben können.

    
Peter Lindqvist 22.12.2009 12:05
quelle
0

Ich glaube nicht, dass Sie diesen Feldern Indizes hinzufügen sollten, da sie nicht viele verschiedene Daten enthalten. Wie für die Art der Felder können Sie jedoch enum Typ berücksichtigen.

    
Sarfraz 22.12.2009 12:06
quelle
-1

Die Entscheidung, ob indexiert werden soll oder nicht, sollte nicht vom Datentyp abhängig sein, sondern von

  • Wie oft suchen Sie nach dem Feld
  • ?
  • wie viele Datensätze die Tabelle haben wird (Größenordnung)
  • ob das Warten auf die nicht indizierte Abfrage (vollständige Tabellensuche) für den Benutzer akzeptabel ist
Pim 22.12.2009 12:08
quelle

Tags und Links