看来,将数据存储在
BINARY列中是一种效果很差的方法。获得良好性能的唯一快速方法是将
BINARY列的内容分为多
BIGINT列,每列包含原始数据的8字节子字符串。
在我的情况下(32字节),这意味着使用4
BIGINT列并使用以下函数:
CREATE FUNCTION HAMMINGDISTANCE( A0 BIGINT, A1 BIGINT, A2 BIGINT, A3 BIGINT, B0 BIGINT, B1 BIGINT, B2 BIGINT, B3 BIGINT)RETURNS INT DETERMINISTICRETURN BIT_COUNT(A0 ^ B0) + BIT_COUNT(A1 ^ B1) + BIT_COUNT(A2 ^ B2) + BIT_COUNT(A3 ^ B3);
在我的测试中,使用这种方法比使用这种
BINARY方法快100倍以上。
FWIW,这是我在解释问题时所暗示的代码。欢迎使用更好的方法来完成相同的事情(我特别不喜欢二进制>十六进制>十进制转换):
CREATE FUNCTION HAMMINGDISTANCE(A BINARY(32), B BINARY(32))RETURNS INT DETERMINISTICRETURN BIT_COUNT( CONv(HEx(SUBSTRINg(A, 1, 8)), 16, 10) ^ CONv(HEx(SUBSTRINg(B, 1, 8)), 16, 10) ) + BIT_COUNT( CONv(HEx(SUBSTRINg(A, 9, 8)), 16, 10) ^ CONv(HEx(SUBSTRINg(B, 9, 8)), 16, 10) ) + BIT_COUNT( CONv(HEx(SUBSTRINg(A, 17, 8)), 16, 10) ^ CONv(HEx(SUBSTRINg(B, 17, 8)), 16, 10) ) + BIT_COUNT( CONv(HEx(SUBSTRINg(A, 25, 8)), 16, 10) ^ CONv(HEx(SUBSTRINg(B, 25, 8)), 16, 10) );
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)