Quét bộ lọc theo bản chất của chúng yêu cầu quét bảng để đánh giá kết quả phù hợp. Trong MySQL không có loại bộ lọc nở. Giải pháp đơn giản là ánh xạ các byte của bộ lọc nở lên BitInteger (các từ 8 byte) và thực hiện kiểm tra trong truy vấn. Vì vậy, giả định rằng nở filteris 8 byte hoặc ít hơn (một bộ lọc rất nhỏ), bạn có thể thực hiện một tuyên bố chuẩn bị như:
SELECT * FROM test WHERE cast(filter, UNSIGNED) & cast(?, UNSIGNED) = cast(?, UNSIGNED)
và thay thế các thông số với giá trị mà bạn đang tìm kiếm. Tuy nhiên đối với các bộ lọc lớn hơn, bạn phải tạo nhiều cột filter
và chia bộ lọc mục tiêu thành nhiều từ. Bạn phải truyền sang unsigned để thực hiện kiểm tra đúng cách.
Vì nhiều bộ lọc nở hợp lý có kích thước từ Kilo đến Megabyte nên sử dụng các đốm màu để lưu trữ chúng.Một khi bạn chuyển sang blobs thì không có cơ chế riêng để thực hiện so sánh mức byte. Và kéo một bảng toàn bộ các đốm màu lớn trên mạng để làm bộ lọc trong mã cục bộ không có ý nghĩa nhiều.
Giải pháp hợp lý duy nhất tôi tìm thấy là UDF. UDF nên chấp nhận một char*
và lặp lại nó để đúc char*
đến một unsigned char*
và thực hiện kiểm tra target & candidate = target
. Mã này sẽ giống như thế:
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;
}
Giải pháp này được thực hiện và có sẵn tại https://github.com/Claudenw/mysql_bloom
Cảm ơn bạn đã tư vấn truy vấn. Tuy nhiên tôi nên làm gì nếu tôi muốn lưu trữ các số "n-bit" dài hơn Số nguyên (32 bit) ... ví dụ: 64 hoặc 128 bit? – Sam
Kiểu dữ liệu Mysql BIT dường như hỗ trợ tới 64 bit. Điều đó có nghĩa là bạn chỉ có thể lưu trữ 64 mục trong bộ lọc nở hoa? –
Tôi cần có khả năng lưu trữ bit n ... điều này giới hạn tôi thành 64. – Sam