Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Jarak hamming pada string biner dalam SQL

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Memesan dengan nomor, String Kosong (atau 0) Terakhir

  2. Skrip Google Apps untuk Mengekspor Spreadsheet ke mySQL dijalankan di banyak file

  3. CakePHP meminta garis lintang bujur terdekat dari database

  4. Masalah Batas Waktu Koneksi MySQL - Aplikasi Grails di Tomcat menggunakan Hibernate dan ORM

  5. Pilihan tertimbang acak dari suatu acara