Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एसक्यूएल में बाइनरी स्ट्रिंग्स पर हैमिंग दूरी

ऐसा प्रतीत होता है कि डेटा को BINARY . में संग्रहीत करना कॉलम खराब प्रदर्शन करने के लिए बाध्य दृष्टिकोण है। अच्छा प्रदर्शन पाने का एकमात्र तेज़ तरीका BINARY . की सामग्री को विभाजित करना है एकाधिक BIGINT . में कॉलम कॉलम, प्रत्येक में मूल डेटा का 8-बाइट सबस्ट्रिंग होता है।

मेरे मामले में (32 बाइट्स) इसका मतलब होगा 4 BIGINT . का उपयोग करना कॉलम और इस फ़ंक्शन का उपयोग करना:

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

इस दृष्टिकोण का उपयोग करना, मेरे परीक्षण में, BINARY . का उपयोग करने की तुलना में 100 गुना तेज है दृष्टिकोण।

एफडब्ल्यूआईडब्ल्यू, यह वह कोड है जिसे मैं समस्या की व्याख्या करते समय संकेत दे रहा था। एक ही चीज़ को पूरा करने के बेहतर तरीकों का स्वागत है (मैं विशेष रूप से बाइनरी> हेक्स> दशमलव रूपांतरण पसंद नहीं करता):

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 एक साथ दो टेबल अपडेट करें

  2. MySQL में पिछले 1 घंटे का डेटा कैसे प्राप्त करें

  3. SQL सीमा चुनें लेकिन शामिल नहीं हों

  4. लगातार विज़िट की संख्या गिनें

  5. MySQL LEAST () फ़ंक्शन - तर्कों की सूची में सबसे छोटा तर्क खोजें