0

私のテーブルには、それぞれ 64 ビットのバイナリ文字列の 8 つの VARCHAR フィールドがあります。私の目標は 、各レジスタのハミング距離を取得することです。私は次のクエリでそれをやっていました:

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_striBINARY に変更したときに、このフィールドのデータが BLOB として表示され、クエリがどのように表示されるかがわからないため、混乱しています。使用する必要がありますCONVか?

4

1 に答える 1

2

64 ビットのバイナリ文字列は、MySQL の型と同じサイズですBIGINT(倍精度浮動小数点数または長整数型の最近のハードウェアの標準サイズ)。a を使用して各フィールドを格納すると、構文の代わりに をBIGINT UNSIGNED使用して他のビット フィールドと比較できます。b'1010...'CONV()

BIT_COUNT(fp.strN ^ b'0000000001101111000000000101011100000000001010100000000001111101')

ハードウェアは 64 ビット値でビット操作を行うように設計されているため、非常に高速です。

于 2013-04-03T15:58:48.047 に答える