MySQL:一种有效的二进制值比较

时间:2013-04-03 15:23:05

标签: mysql types binary

我的表有8个VARCHAR字段,每个字段的二进制字符串为64位。我的目标是为每个寄存器获取Hamming distance。我正在使用下一个查询:

SELECT 
 BIT_COUNT(CONV(fp.bin_str0, 2, 10 ) ^ CONV('0000000001101111000000000101011100000000001010100000000001111101', 2, 10 )) + 
 BIT_COUNT(CONV(fp.bin_str1, 2, 10 ) ^ CONV('0000000010110001000000001000000000000000011000010000000011110100', 2, 10 )) + 
 BIT_COUNT(CONV(fp.bin_str2, 2, 10 ) ^ CONV('0000000010010100000000000010101100000000110001000000000011100100', 2, 10 )) + 
 BIT_COUNT(CONV(fp.bin_str3, 2, 10 ) ^ CONV('0000000011101011000000000001110000000000101100010000000000011001', 2, 10 )) + 
 BIT_COUNT(CONV(fp.bin_str4, 2, 10 ) ^ CONV('0000000000010000000000000011010100000000111011100000000001001101', 2, 10 )) + 
 BIT_COUNT(CONV(fp.bin_str5, 2, 10 ) ^ CONV('0000000000101111000000000110101000000000000010100000000000101101', 2, 10 )) + 
 BIT_COUNT(CONV(fp.bin_str6, 2, 10 ) ^ CONV('0000000000011000000000000101011000000000001010000000000000001011', 2, 10 )) + 
BIT_COUNT(CONV(fp.bin_str7, 2, 10 ) ^ CONV('0000000000101011000000000011100100000000000100000000000000111010', 2, 10 )) from mytable fp

所以这个查询非常慢。有一些原因:mytable有3M寄存器,字段fp.bin_stri是VARCHAR类型。

由于MySQL具有BINARY类型,我可以在BINARY类型的fp.bin_stri上执行相同的查询吗?怎么样?

我很困惑,因为当我将fp.bin_stri更改为BINARY时,此字段的数据显示为BLOB,现在我不知道查询应该如何。它应该使用CONV吗?

1 个答案:

答案 0 :(得分:2)

64位二进制字符串与MySQL BIGINT类型的大小相同(在双精度浮点数或长整数的现代硬件上的标准大小)。使用BIGINT UNSIGNED存储每个字段,然后您可以使用b'1010...'语法而不是CONV()与其他位字段进行比较。

BIT_COUNT(fp.strN ^ b'0000000001101111000000000101011100000000001010100000000001111101')

应该非常快,因为硬件设计为在64位值上进行位操作。