0

我的表有 8 个 VARCHAR 字段,每个字段都是 64 位的二进制字符串。我的目标是获得 每个寄存器的汉明距离。我正在使用下一个查询:

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吗?

4

1 回答 1

2

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

BIT_COUNT(fp.strN ^ b'0000000001101111000000000101011100000000001010100000000001111101')

应该非常快,因为硬件旨在对 64 位值进行位操作。

于 2013-04-03T15:58:48.047 回答