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)
);