我的表有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
吗?
答案 0 :(得分:2)
64位二进制字符串与MySQL BIGINT
类型的大小相同(在双精度浮点数或长整数的现代硬件上的标准大小)。使用BIGINT UNSIGNED
存储每个字段,然后您可以使用b'1010...'
语法而不是CONV()
与其他位字段进行比较。
BIT_COUNT(fp.strN ^ b'0000000001101111000000000101011100000000001010100000000001111101')
应该非常快,因为硬件设计为在64位值上进行位操作。