it-swarm.com.de

Indizieren von booleschen Feldern

Dies ist wahrscheinlich eine wirklich dumme Frage, aber wird die Indizierung eines booleschen Felds in einer Datenbanktabelle von großem Nutzen sein?

In einer üblichen Situation wie "soft-delete" -Datensätze, die als inaktiv gekennzeichnet sind, und daher die meisten Abfragen WHERE deleted = 0 enthalten, wäre es hilfreich, dieses Feld eigenständig zu indizieren oder es mit den anderen häufig gesuchten Feldern in zu kombinieren ein anderer Index?

67
nickf

Nein.

Sie indizieren Felder, nach denen gesucht wird und die 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 gruppierten Index machen, wenn bei jeder Abfrage weiches Löschen berücksichtigt würde?

53
Mark Canlas

Was ist eine DELETTE_AT-DATETIME-Spalte? Es gibt zwei Vorteile.

  1. Wenn Sie eine eindeutige Spalte wie name benötigen, können Sie einen Datensatz mit demselben Namen mehrmals erstellen und löschen (wenn Sie einen eindeutigen Index für die Spalten deleted_at AND name verwenden).
  2. Sie können nach kürzlich gelöschten Datensätzen suchen.

Ihre Abfrage könnte so aussehen:

SELECT * FROM xyz WHERE deleted_at IS NULL
17
jhlllnd

Ich denke, es würde vor allem bei der Abdeckung von Indizes hilfreich sein.

Wie viel/wenig ist natürlich abhängig von Ihren Daten und Anfragen. 

Sie können Theorien aller Art über Indizes erstellen, die endgültigen Antworten werden jedoch von der Datenbank-Engine in einer Datenbank mit realen Daten angegeben. Und oft sind Sie von der Antwort überrascht (oder meine Theorien sind vielleicht 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 ziemlich einfach, Indizes zu ändern und zu sehen, welchen Unterschied sie machen

6
Brimstedt

ich denke, wenn Ihr boolesches Feld so ist, dass Sie in vielen Fällen darauf verweisen würden, wäre es sinnvoll, eine separate Tabelle zu haben, z. B. "DeletePages" oder "SpecialPages", die viele boolesche Typfelder wie is_deleted, is_hidden, is_really_deleted, enthält. requires_higher_user etc, und dann würden Sie Joins nehmen, um sie zu erhalten. 

Normalerweise ist die Größe dieser Tabelle geringer, und Sie erhalten einen gewissen Vorteil, wenn Sie Joins verwenden, insbesondere hinsichtlich der Lesbarkeit und der Wartbarkeit von Code. 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 denke, ich habe irgendwo über Mysql-Datenbanken gelesen, dass Sie ein Feld benötigen, um mindestens eine Kardinalität von 3 zu haben, damit die Indexierung in diesem Feld funktioniert, aber bestätigen Sie dies bitte.

2
umar

Ich denke, es wäre hilfreich, wenn Sie eine Ansicht verwenden würden (wobei delete = 0) und Sie regelmäßig aus dieser Ansicht abfragen.

1
Adriaan Stander

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.

0
Rondo