Có vẻ như lưu trữ dữ liệu trong một BINARY
cột là một cách tiếp cận bị ràng buộc để hoạt động kém. Cách nhanh duy nhất để có được hiệu suất tốt là chia nhỏ nội dung của BINARY
trong nhiều BIGINT
, mỗi cột chứa một chuỗi con 8 byte của dữ liệu gốc.
Trong trường hợp của tôi (32 byte), điều này có nghĩa là sử dụng 4 BIGINT
và sử dụng chức năng này:
CREATE FUNCTION HAMMINGDISTANCE(
A0 BIGINT, A1 BIGINT, A2 BIGINT, A3 BIGINT,
B0 BIGINT, B1 BIGINT, B2 BIGINT, B3 BIGINT
)
RETURNS INT DETERMINISTIC
RETURN
BIT_COUNT(A0 ^ B0) +
BIT_COUNT(A1 ^ B1) +
BIT_COUNT(A2 ^ B2) +
BIT_COUNT(A3 ^ B3);
Sử dụng phương pháp này, trong thử nghiệm của tôi, nhanh hơn 100 lần so với sử dụng BINARY
cách tiếp cận.
FWIW, đây là mã tôi đã gợi ý khi giải thích vấn đề. Những cách tốt hơn để đạt được điều tương tự được hoan nghênh (tôi đặc biệt không thích chuyển đổi nhị phân> hex> thập phân):
CREATE FUNCTION HAMMINGDISTANCE(A BINARY(32), B BINARY(32))
RETURNS INT DETERMINISTIC
RETURN
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)
);