Dies ist wahrscheinlich eine wirklich dumme Frage, aber wird es von großem Vorteil sein, ein boolesches Feld in einer Datenbanktabelle zu indizieren?
In einer häufigen Situation, wie z. B. "Soft-Delete" -Datensätze, die als inaktiv gekennzeichnet sind und daher die meisten Abfragen enthalten WHERE deleted = 0
, wäre es hilfreich, dieses Feld selbst zu indizieren, oder sollte es mit den anderen häufig gesuchten Feldern in a kombiniert werden anderer Index?
Antworten:
Nein.
Sie indizieren Felder, die durchsucht werden und eine hohe Selektivität / Kardinalität aufweisen. Die Kardinalität eines Booleschen Feldes wird in fast jeder Tabelle ausgelöscht. Wenn überhaupt, werden Ihre Schreibvorgänge langsamer (um einen so winzigen Betrag).
Vielleicht würden Sie es zum ersten Feld im Clustered-Index machen, wenn jede Abfrage weiche Löschungen berücksichtigt?
quelle
WHERE field = false
bieten ein Teilindex oder bestimmte andere Nicht-Btree-Indizes, die normalerweise plattformspezifisch sind, Alternativen zu einem Btree für die Suche nach Booleschen Werten. Dies hängt auch von Ihren Suchbedingungen ab und davon, welcher Teil der Tabelle wahr oder falsch ist.Was ist mit einer deleted_at DATETIME-Spalte? Es gibt zwei Vorteile.
Ihre Abfrage könnte folgendermaßen aussehen:
SELECT * FROM xyz WHERE deleted_at IS NULL
quelle
Ich denke, es würde helfen, insbesondere bei der Abdeckung von Indizes.
Wie viel / wenig hängt natürlich von Ihren Daten und Abfragen ab.
Sie können Theorien aller Art über Indizes haben, aber die endgültigen Antworten werden von der Datenbank-Engine in einer Datenbank mit realen Daten gegeben. Und oft wundert dich die Antwort (oder vielleicht sind meine Theorien zu schlecht;)
Untersuchen Sie den Abfrageplan Ihrer Abfragen und stellen Sie fest, ob die Abfragen verbessert werden können oder ob die Indizes verbessert werden können. Es ist ganz einfach, Indizes zu ändern und zu sehen, welchen Unterschied es macht
quelle
Ich denke, es würde helfen, wenn Sie eine Ansicht verwenden (wobei gelöscht = 0) und Sie regelmäßig von dieser Ansicht abfragen.
quelle
Ich denke , wenn Ihr boolean Feld so ist , dass man in vielen Fällen zu ihnen würde mit Bezug, wäre es sinnvoll , eine separate Tabelle zu haben, beispielsweise DeletedPages oder Special, die viele boolean Typ Felder haben, wie
is_deleted
,is_hidden
,is_really_deleted
,requires_higher_user
usw, und dann würden Sie Joins nehmen, um sie zu bekommen.In der Regel ist die Größe dieser Tabelle kleiner, und Sie erhalten einige Vorteile, wenn Sie Verknüpfungen verwenden, insbesondere was die Lesbarkeit und Wartbarkeit von Code betrifft. Und für diese Art von Abfrage:
select all pages where is_deleted = 1
Es wäre schneller, wenn es so implementiert würde:
select all pages where pages inner join DeletedPages on page.id=deleted_pages.page_id
Ich glaube, ich habe irgendwo über MySQL-Datenbanken gelesen, dass Sie ein Feld benötigen, das mindestens eine Kardinalität von 3 hat, damit die Indizierung für dieses Feld funktioniert, aber bitte bestätigen Sie dies.
quelle
Wenn Sie eine Datenbank verwenden, die Bitmap-Indizes unterstützt (z. B. Oracle), ist ein solcher Index für eine boolesche Spalte viel nützlicher als ohne.
quelle