Bloom Filter durch ihre Natur erfordern Tabellen-Scans Spiele zu bewerten. In MySQL gibt es keinen Bloomfiltertyp. Die einfache Lösung besteht darin, die Bytes des Bloom-Filters auf BitInteger (8-Byte-Wörter) abzubilden und die Überprüfung in der Abfrage durchzuführen. So unter der Annahme, dass die Blüte filteris 8 Bytes oder weniger (ein sehr kleiner Filter) Sie konnten eine vorbereitete Anweisung wie ausführen:
SELECT * FROM test WHERE cast(filter, UNSIGNED) & cast(?, UNSIGNED) = cast(?, UNSIGNED)
und ersetzen Sie die Parameter mit dem Wert, den Sie suchen. Bei größeren Filtern müssen Sie jedoch mehrere filter
Spalten erstellen und den Zielfilter in mehrere Wörter aufteilen. Sie müssen in unsigned umwandeln, um die Überprüfung ordnungsgemäß durchzuführen.
Da viele brauchbare Bloom-Filter im Kilo- bis Megabyte-Bereich liegen, ist es sinnvoll, sie mit Blobs zu speichern.Sobald Sie zu Blobs wechseln, gibt es keine systemeigenen Mechanismen, um die Byte-Level-Vergleiche durchzuführen. Und eine ganze Tabelle mit großen Blobs über das Netzwerk zu ziehen, um den Filter im Code lokal auszuführen, macht wenig Sinn.
Die einzige vernünftige Lösung, die ich gefunden habe, ist eine UDF. Die UDF sollte eine char*
akzeptieren und iterieren über die char*
zu einer unsigned char*
Gießen und die target & candidate = target
Überprüfung durchführen. Dieser Code würde in etwa so aussehen:
my_bool bloommatch(UDF_INIT *initid, UDF_ARGS *args, char* result, unsigned long* length, char *is_null, char *error)
{
if (args->lengths[0] > args->lengths[1])
{
return 0;
}
char* b1=args->args[0];
char* b2=args->args[1];
int limit = args->lengths[0];
unsigned char a;
unsigned char b;
int i;
for (i=0;i<limit;i++)
{
a = (unsigned char) b1[i];
b = (unsigned char) b2[i];
if ((a & b) != a)
{
return 0;
}
}
return 1;
}
Diese Lösung implementiert und ist bei https://github.com/Claudenw/mysql_bloom
Vielen Dank für die Abfrage Beratung. Was soll ich aber tun, wenn ich "n-Bit" -Zahlen speichern möchte, die länger sind als Integer (32 Bit) ... zum Beispiel 64 oder 128 Bit? – Sam
Mysql BIT-Datentyp scheint bis zu 64 Bits zu unterstützen. Bedeutet das, dass Sie nur 64 Artikel im Bloom-Filter speichern können? –
Ich muss n-Bits speichern können ... das beschränkt mich auf 64. – Sam