Ist das Erstellen eines Index für das BIT (n) -Attribut in MySQL sinnvoll?

7

Ich arbeite an einer ganz bestimmten Sache und muss BIT(n)Attribute verwenden und diese effizient durchsuchen. nist in der Regel keine Potenz von 2.

Ich habe im Internet einige Erwähnungen gesehen, dass BITAttribute in MySQL nicht indexfreundlich sind. Ohne weitere Ausarbeitung.

Die Frage ist also: Funktionieren MySQL-Indizes gut mit BIT(n)Attributen oder finde ich besser andere Möglichkeiten, z. B. auf n32 zu beschränken und INTstattdessen zu verwenden?

bazzilic
quelle

Antworten:

6

Wenn Sie nicht nach einer genauen Übereinstimmung für den gesamten in der Bitspalte gespeicherten Wert fragen, hilft ein Index nicht, da er im Allgemeinen nicht verwendet werden kann. Auf die entfernte Chance, dass Sie sind, dann würde es.

Die Gründe, warum ein Index nicht verwendet werden kann, wenn ein Bitmap-Wert gespeichert und dann basierend auf dem Status eines oder mehrerer Bits abgefragt wird, sind die Tatsache, dass die allgemein verfügbaren Indextypen in MySQL nur für die genaue Wert- oder Bereichsübereinstimmung nützlich sind bitweise Vergleiche sind nicht wirklich eines dieser Dinge.

Aufgrund der Art dieser Einschränkung gilt dies auch, wenn Sie einen der ganzzahligen Datentypen oder sogar den SET-Datentyp verwenden.

Zugegeben, das Testen des Status des High-Bits an einer 8-Bit-Nummer ist dasselbe wie das Testen, ob die Nummer> = 128 ist, was in der Tat eine Bereichsübereinstimmung ist und unter Verwendung eines B-Tree-Index erreicht werden könnte, aber bis Wenn Sie einen Index für diesen Test verwenden, muss der Optimierer verstehen, dass Sie "wirklich" fragen, wann Sie tatsächlich gefragt haben, WO bin_col & b'10000000 '... der Optimierer wird dies nicht realisieren Das.

Meine Neigung zum Speichern von Bitmap-Werten wäre die Verwendung einer UNSIGNED [Something] INT-Spalte, da BIT-Spalten in MySQL tatsächlich eher mit CHAR / BINARY-Spalten als mit ganzzahligen Daten vergleichbar sind. Dies hängt jedoch letztendlich auch von Ihrer Anwendung ab Ihre Speicher-Engine.

MyISAM speichert anscheinend verschiedene Bitspalten zusammen in den Rohzeilendaten. Wenn Sie also nicht einmal Inkremente vom 16.08.32/64 verwenden, kann dies einen kleinen Speichervorteil bei der Verwendung von BITs gegenüber INTs bedeuten - es sei denn, Sie ' Wenn Sie MyISAM bereits verwenden, würde ich nicht glauben, dass dies von ausreichendem Vorteil ist, um Sie dazu zu bringen, es in Betracht zu ziehen.

Die MEMORY- und InnoDB-Engines weisen die kleinste Standard-Ganzzahlgröße zu, die die erforderliche Anzahl von Bits in einer BIT-Spalte enthalten kann.

Der Datentyp SET speichert die Werte auch als vorzeichenlose Ganzzahl von 1, 2, 3, 4 oder 8 Byte, je nach Anzahl der Beschriftungen, die Sie für die Bits definieren. Es ist für die Augäpfel einfacher, wenn Sie Ihre gespeicherten Bitmap-Daten betrachten, denn wenn Sie daraus auswählen, ohne das Ergebnis in eine Ganzzahl umzuwandeln (entweder explizit oder implizit mit SELECT Spaltenname + 0), erhalten Sie ein durch Kommas getrenntes Ergebnis zurück Liste der Beschriftungen der Bits, die auf "Ein" gesetzt sind ... Es bietet keine Optimierung beim Abfragen, bietet Ihnen jedoch die Möglichkeit, Ihre Bits ohne wirkliche Nachteile auf Beschriftungen zu erweitern, verglichen mit der Verwendung einer rohen Ganzzahl Säule.

Michael - sqlbot
quelle
Danke für diese ausführliche Antwort! Ja, ich verstehe, dass b-tree nicht bei der Suche nach Werten durch Prädikate mit bitweisen Operationen helfen kann. Ich war mir jedoch nicht sicher, wie MySQL BITattrs in InnoDB speichert (Entschuldigung, ich habe vergessen zu erwähnen, dass ich InnoDB verwende) und ob dies Auswirkungen auf die Indizierung hat oder nicht. Laut Ihrer Antwort scheint die Verwendung BITanstelle anderer numerischer Typen den einzigen Vorteil zu haben - Bequemlichkeit, wenn Sie eine andere Anzahl von Bits als die Potenz von 2
benötigen