Tampaknya menyimpan data dalam BINARY
kolom adalah pendekatan yang pasti berkinerja buruk. Satu-satunya cara cepat untuk mendapatkan kinerja yang layak adalah dengan membagi konten BINARY
kolom dalam beberapa BIGINT
kolom, masing-masing berisi substring 8-byte dari data asli.
Dalam kasus saya (32 byte) ini berarti menggunakan 4 BIGINT
kolom dan menggunakan fungsi ini:
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);
Menggunakan pendekatan ini, dalam pengujian saya, lebih dari 100 kali lebih cepat daripada menggunakan BINARY
pendekatan.
FWIW, ini adalah kode yang saya maksudkan saat menjelaskan masalahnya. Cara yang lebih baik untuk mencapai hal yang sama dipersilakan (saya terutama tidak suka biner> hex> konversi desimal):
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)
);