【问题标题】:MySQL: an efficient binary value comparisonMySQL:高效的二进制值比较
【发布时间】:2013-04-03 15:23:04
【问题描述】:

我的表有 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吗?

【问题讨论】:

    标签: mysql types binary


    【解决方案1】:

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

    BIT_COUNT(fp.strN ^ b'0000000001101111000000000101011100000000001010100000000001111101')
    

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

    【讨论】:

    • 当我向数据库插入一个新值时,我应该如何转换它?将其插入为 BINARY 就足够了吗?
    • 如果您要插入 1 和 0 的序列,您可以使用二进制文字语法“b''”。 INSERT INTO mytable (str1,...) VALUES (b'1010',...).
    • 我应该补充一点,如果您需要经常加载整个表,LOAD DATA INFILE 会更快,但您需要在文件中将二进制字段表示为无符号整数。见dev.mysql.com/doc/refman/5.5/en/load-data.html
    猜你喜欢
    • 2013-04-23
    • 2011-04-30
    • 1970-01-01
    • 2019-03-10
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2016-08-16
    相关资源
    最近更新 更多