Ich bin gerade dabei, eine Abfrage zu schreiben, die a enthält WHERE isok=1
. Wie der Name schon sagt, isok
handelt es sich um ein boolesches Feld (tatsächlich ein Feld TINYINT(1) UNSIGNED
, das je nach Bedarf auf 0 oder 1 gesetzt wird).
Gibt es einen Leistungsgewinn bei der Indizierung dieses Feldes? Würde die Engine (in diesem Fall InnoDB) beim Nachschlagen des Index besser oder schlechter abschneiden?
Antworten:
Nicht wirklich. Sie sollten wie ein Buch darüber nachdenken. Wenn ein Buch nur drei Arten von Wörtern enthält und Sie alle indizieren, haben Sie die gleiche Anzahl von Indexseiten wie normale Seiten.
Es würde einen Leistungsgewinn geben, wenn es relativ wenige Datensätze mit einem Wert gibt. Wenn Sie beispielsweise 1000 Datensätze haben und 10 davon WAHR sind, ist es hilfreich, wenn Sie mit suchen
isok = 1
Wie Michael Durrant erwähnte, verlangsamt es auch das Schreiben.
EDIT: Mögliche Duplizierung: Indizierung von Booleschen Feldern
Hier wird erklärt, dass selbst wenn Sie einen Index haben, wenn Sie zu viele Datensätze haben, der Index sowieso nicht verwendet wird. MySQL verwendet keinen Index, wenn = 1 überprüft wird, sondern verwendet ihn mit = 0
quelle
Um einige andere Antworten hier genauer zu formulieren: Da sich meiner Erfahrung nach diejenigen, die Fragen wie diese betrachten, im selben Boot befinden wie wir, haben wir alle gehört, dass das Indizieren von Booleschen Feldern sinnlos ist, und doch ...
Wir haben eine Tabelle mit ungefähr 4 Millionen Zeilen, von denen jeweils nur ungefähr 1000 einen Booleschen Schalter markiert haben, und danach suchen wir. Das Hinzufügen eines Index für unser Boolesches Feld beschleunigte die Abfragen um Größenordnungen und ging von mehr als 9 Sekunden auf einen Bruchteil einer Sekunde.
quelle
WHERE my_col > 0
stattmy_col = 1
scheint auch zu beschleunigenDies hängt von den tatsächlichen Abfragen und der Selektivität der Index / Abfrage-Kombination ab.
Fall A : Zustand
WHERE isok = 1
und sonst nichts da:Wenn der Index selektiv genug ist (sagen wir, Sie haben 1 Million Zeilen und nur 1 KB
isok = 1
), wird die SQL-Engine den Index wahrscheinlich verwenden und schneller sein als ohne.Wenn der Index nicht selektiv genug ist (z. B. 1 Million Zeilen und mehr als 100.000
isok = 1
), verwendet die SQL-Engine den Index wahrscheinlich nicht und führt einen Tabellenscan durch.Fall B : Zustand
WHERE isok = 1
und mehr Zeug:Dann hängt es davon ab, welche anderen Indizes Sie haben. Ein Index für
another_column
wäre wahrscheinlich selektiver als der Index, fürisok
den nur zwei mögliche Werte vorliegen. Ein Index auf(another_column, isok)
oder(isok, another_column)
wäre noch besser.quelle
Dies hängt von der Verteilung der Daten ab.
Stellen Sie sich vor, ich hätte ein Buch mit 1000 eng getippten Seiten, und die einzigen Wörter in meinem Buch waren "Ja" und "Nein", die immer wieder wiederholt und zufällig verteilt wurden. Wenn ich gebeten würde, alle Instanzen von "Ja" zu kreisen, würde ein Index am Ende des Buches helfen? Es hängt davon ab, ob.
Wenn es eine halb und halb zufällige Verteilung von Ja und Nein gäbe, würde es nicht helfen, im Index nachzuschlagen. Der Index würde das Buch viel größer machen, und trotzdem würde ich schneller von vorne beginnen und mich durch jede Seite arbeiten, um nach allen Instanzen von "Ja" zu suchen und sie zu umkreisen, anstatt jedes Element darin nachzuschlagen den Index und dann den Verweis vom Indexeintrag auf die Seite, auf die er verweist.
Aber wenn es in meinem tausendseitigen Buch nur zehn Fälle von "Ja" gäbe und alles andere nur Millionen von "Nein", würde mir ein Index viel Zeit sparen, wenn ich diese zehn Fälle von "Ja" finde und sie umkreise .
In Datenbanken ist es genauso. Wenn es sich um eine 50: 50-Verteilung handelt, hilft ein Index nicht weiter - das Datenbankmodul ist besser dran, wenn Sie nur die Daten von Anfang bis Ende durchforsten (vollständiger Tabellenscan), und der Index würde die Datenbank nur vergrößern, und langsamer zu schreiben und zu aktualisieren. Wenn es sich jedoch um eine 4000: 1-Verteilung handelt (wie in diesem Thread beschrieben), kann eine Indexsuche die Verteilung erheblich beschleunigen, wenn es sich um die 1: 4000-Elemente handelt, nach denen Sie suchen.
quelle
Nein, normalerweise nicht.
Normalerweise indizieren Sie Felder für die Suche, wenn sie eine hohe Selektivität / Kardinalität aufweisen. Die Kardinalität eines Booleschen Feldes ist in den meisten Tabellen sehr gering. Es würde auch Ihre Schreibvorgänge etwas langsamer machen.
quelle
Tatsächlich hängt dies von den von Ihnen ausgeführten Abfragen ab. Aber im Allgemeinen ja, sowie das Indizieren eines Feldes eines anderen Typs.
quelle
Ja, ein Index verbessert die Leistung. Überprüfen Sie die Ausgabe von EXPLAIN mit und ohne Index.
Aus den Dokumenten:
Ich denke, es ist auch sicher zu sagen, dass ein Index in diesem Fall die Performance nicht VERRINGERT , sodass Sie nur davon profitieren müssen.
quelle
TINYINT(1) UNSIGNED
Spalte ist die Größe der Daten klein.