Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Khoảng cách Hamming trên chuỗi nhị phân trong SQL

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để Django hoạt động với MySQL trong XAMPP?

  2. MySQL - Khóa ngoại duy nhất

  3. Cách cài đặt MySQL trên Debian 8

  4. Tính toán khoảng cách giữa các mã zip trong PHP

  5. Hủy chia bảng trong MySQL