Zdá se, že ukládání dat do BINARY
sloupec je přístup, který bude mít špatný výkon. Jediný rychlý způsob, jak dosáhnout slušného výkonu, je rozdělit obsah BINARY
sloupec ve více BIGINT
sloupce, z nichž každý obsahuje 8bajtový podřetězec původních dat.
V mém případě (32 bajtů) by to znamenalo použití 4 BIGINT
sloupce a pomocí této funkce:
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);
Použití tohoto přístupu je při mém testování více než 100krát rychlejší než použití BINARY
přístup.
FWIW, toto je kód, na který jsem narážel při vysvětlování problému. Vítáme lepší způsoby, jak dosáhnout stejné věci (obzvláště nemám rád binární> hex> desítkové převody):
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)
);