布隆過濾器本質上需要表掃瞄來評估匹配。在mysql中,沒有布隆過濾器型別。簡單的解決方案是將布隆過濾器的位元組對映到bitinteger(8位元組字)並在查詢中執行檢查。因此,假設bloom過濾8個位元組或更少(乙個非常小的過濾器),你可以執行乙個準備好的語句,如:
select * from test where cast(filter, unsigned) & cast(?, unsigned) = cast(?, unsigned)
並將引數替換為您要查詢的值。但是,對於較大的過濾器,您必須建立多個filter列,並將目標過濾器拆分為多個單詞。你必須轉為無符號才能正確地進行檢查。
由於許多合理的布隆過濾器在kilo到megabyte範圍內,因此使用blob來儲存它們是有意義的。切換到blob後,沒有本機機制來執行位元組級比較。並且在整個網路中提取整個大型blob表以在本地**中進行過濾沒有多大意義。
我找到的唯一合理的解決方案是udf。 udf應接受char*並對其進行迭代,將char*轉換為unsigned char*並執行target & candidate = target檢查。此**看起來像:
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
a = (unsigned char) b1[i];
b = (unsigned char) b2[i];
if ((a & b) != a)
return 0;
return 1;
此解決方案已實施且可用here
位 mysql 查詢 Mysql 查詢 按位運算
前言 雖說這是件小事兒,但本寶寶思前想後,還是為它留下一筆,嘿嘿。反正寫部落格不浪費紙和筆!好久沒有開啟我的逗比模式了,我親愛的乖徒弟dba,dbb,dbaa等,好久不見你們,遙祝幸福快樂 db。整個事情其實使這樣的,最近的專案中,有乙個表,最終是這樣的 一共 位,每一位的取值是 和 額,後來還有 ...
mysql 按時間搜尋 按日期搜尋mysql效能
我有乙個包含大約1億條記錄的大表,其字段為start date和end date,具有date型別.我需要檢查一些日期範圍的重疊次數,比如介於2013 08 20和2013 08 30之間,所以我使用了.select count from mytable where end date 2013 08...
按位AND和按位OR
description 已知長度為n的兩個位串a和b,求它們的按位and和按位or。input 多組測試資料,每組測試資料第1行輸入位串長度n 0 n 64 第2行輸入n個以空格隔開的取值為0或1的整數表示位串a,第3行輸入n個以空格隔開的取值為0或1的整數表示位串b。output 每組測試資料佔兩...