2009-02-02 18 views
25

मान लीजिए कि मैं एक संख्यात्मक के बजाय एक हैश का उपयोग करना चाहता हूं। क्या यह गैर-बाइनरी पर BINARY के रूप में स्टोर करने के लिए एक प्रदर्शन लाभ होगा?हैश आईडी के लिए गैर-बाइनरी के खिलाफ MySQL बाइनरी

CREATE TABLE `test`.`foobar` (
    `id` CHAR(32) BINARY CHARACTER SET ascii COLLATE ascii_bin NOT NULL, 
    PRIMARY KEY (`id`) 
) 
CHARACTER SET ascii; 
+0

क्या आप "लाभ" के बारे में अधिक विशिष्ट हो सकते हैं? क्या आप अंतरिक्ष के लिए, प्रदर्शन के लिए, आसानी से उपयोग के लिए, या अद्वितीय मूल्यों की सीमा के लिए अनुकूलित करने की कोशिश कर रहे हैं? –

+0

मैं मुख्य रूप से प्रदर्शन लाभों में रूचि रखता हूं क्योंकि अंतरिक्ष लगभग मुक्त है और 128 बिट मान वैल्यू रेंज को दोगुना कर देता है जिसे मैं प्राथमिक कुंजी के रूप में बिगिनट का उपयोग करता हूं। – Gumbo

उत्तर

28

हां।

0800fc577294c34e0b28ad2839435945 

यह एक 32-चरित्र ASCII स्ट्रिंग है: अक्सर एक हैश डाइजेस्ट, के लिए शब्द 'हैश' का उदाहरण MD5 है हेक्स अंक की ASCII प्रतिनिधित्व के रूप में संग्रहीत किया जाता है।

लेकिन एमडी 5 वास्तव में 128-बिट बाइनरी हैश मान उत्पन्न करता है। यह को केवल 16 बाइट्स हेक्स अंकों के बजाय बाइनरी मानों के रूप में संग्रहीत करने की आवश्यकता है। तो आप बाइनरी तारों का उपयोग कर कुछ अंतरिक्ष दक्षता प्राप्त कर सकते हैं।

CREATE TABLE test.foobar (
    id BINARY(16) NOT NULL PRIMARY KEY 
); 

INSERT INTO test.foobar (id) VALUES (UNHEX(MD5('hash'))); 

पुन। आपकी टिप्पणियां कि आप अंतरिक्ष दक्षता की तुलना में प्रदर्शन के बारे में अधिक चिंतित हैं:

मुझे किसी भी कारण से पता नहीं है कि BINARY डेटा प्रकार CHAR से तेज होगा।

यदि आप कैश बफर का प्रभावी ढंग से उपयोग करते हैं तो प्रदर्शन के लिए आधे से अधिक होने का लाभ हो सकता है। यही है, कैश मेमोरी की एक दी गई मात्रा द्विआधारी डेटा के बराबर कई पंक्तियों को स्टोर कर सकती है यदि स्ट्रिंग हेक्स में समान मान को स्टोर करने के लिए आवश्यक चार्ज का आधा आकार है। इसी प्रकार उस कॉलम पर इंडेक्स के लिए कैश मेमोरी दो गुना ज्यादा स्टोर कर सकती है।

परिणाम एक अधिक प्रभावी कैश है, क्योंकि एक यादृच्छिक क्वेरी में डिस्क एक्सेस की आवश्यकता के बजाय कैश किए गए डेटा या अनुक्रमणिका को मारने का अधिक अवसर होता है। अधिकांश डेटाबेस अनुप्रयोगों के लिए कैश दक्षता महत्वपूर्ण है, क्योंकि आम तौर पर बाधा डिस्क I/O है। यदि आप डिस्क I/O की आवृत्ति को कम करने के लिए कैश मेमोरी का उपयोग कर सकते हैं, तो यह एक डेटा प्रकार या किसी अन्य के बीच की तुलना में हिरन के लिए एक बहुत बड़ा बैंग है।

बिगिन बनाम बिएनरी में संग्रहीत हैश स्ट्रिंग के बीच अंतर के लिए, मैं बिगिनट का चयन करूंगा। कैश दक्षता भी अधिक होगी, और 64-बिट प्रोसेसर पर पूर्णांक अंकगणित और तुलना भी बहुत तेज होनी चाहिए।

मेरे पास उपरोक्त दावों का समर्थन करने के लिए माप नहीं है। किसी अन्य डेटा पर एक डेटा प्रकार चुनने का शुद्ध लाभ आपके डेटाबेस और एप्लिकेशन में डेटा पैटर्न और प्रश्नों के प्रकार पर बहुत निर्भर करता है। सबसे सटीक उत्तर प्राप्त करने के लिए, आपको दोनों समाधानों का प्रयास करना होगा और अंतर को मापना होगा।


पुन:।

mysql> SELECT BENCHMARK(100000000, 'foo' = 'FOO'); 
1 row in set (5.13 sec) 

mysql> SELECT BENCHMARK(100000000, 'foo' = BINARY 'FOO'); 
1 row in set (4.23 sec) 

तो बाइनरी स्ट्रिंग तुलना 17.5% केस-संवेदी स्ट्रिंग तुलना की तुलना में तेजी है: अपने अनुमान है कि बाइनरी स्ट्रिंग तुलना डिफ़ॉल्ट केस-संवेदी स्ट्रिंग तुलना से ज़्यादा तेज़ है, मैं निम्नलिखित परीक्षण की कोशिश की। लेकिन ध्यान दें कि इस अभिव्यक्ति का मूल्यांकन 100 मिलियन बार करने के बाद, कुल अंतर अभी भी 1 सेकंड से कम है।जबकि हम गति में सापेक्ष अंतर को माप सकते हैं, गति में पूर्ण अंतर वास्तव में महत्वहीन है।

तो मैं दोहराना होगा:

  • मापें, अनुमान या लगता नहीं है। आपके शिक्षित अनुमान बहुत समय से गलत होंगे। आपके द्वारा किए गए हर बदलाव से पहले और बाद में मापें, ताकि आप जान सकें कि इससे कितनी मदद मिली।
  • अपना समय और ध्यान निवेश करें जहां आपको हिरन के लिए सबसे बड़ी धमाका मिलती है।
  • छोटी चीजें पसीना न करें। बेशक, एक छोटे से अंतर पर्याप्त पुनरावृत्तियों के साथ जोड़ता है, लेकिन उन पुनरावृत्तियों को देखते हुए, अधिक पूर्ण लाभ के साथ एक प्रदर्शन सुधार अभी भी बेहतर है।
+0

मैंने पहले ही इसके बारे में सोचा है। यह मुझे अंतरिक्ष का आधा बचाएगा हालांकि 2^128 पर्याप्त तरीके से हैं (बिगिनट में केवल 2^64 है और यह पहले से ही पर्याप्त है)। – Gumbo

+0

मैंने आपके प्रश्न को अपडेट किया है जैसा आपने अनुरोध किया था। अगर आप इसे एक और नजर डालें तो मैं अच्छा होगा। – Gumbo

+0

मैंने सोचा कि बाइनरी तेज होगी क्योंकि सामान्य तुलना जैसे ऊपरी और निचले केस अक्षरों की कोई अतिरिक्त तुलना नहीं होती है ताकि "'foo' = 'FOO'" सत्य हो लेकिन "BINARY 'foo' = 'FOO" "false – Gumbo

6

the manual से:

The BINARY and VARBINARY types are similar to CHAR and VARCHAR, except 
that they contain binary strings rather than non-binary strings. That is, 
they contain byte strings rather than character strings. This means that 
they have no character set, and sorting and comparison are based on the 
numeric values of the bytes in the values. 

के बाद से CHAR (32) बाइनरी किसी बायनरी का कारण बनता है (32) स्तंभ हुड के नीचे बनाया जाना, लाभ यह है कि यह कम समय है कि द्वारा सॉर्ट करने के लिए ले जाएगा है कॉलम, और कॉलम अनुक्रमित होने पर संबंधित पंक्तियों को खोजने के लिए शायद कम समय।

+0

आपके उत्तर के लिए धन्यवाद। आपको इसके बारे में कुछ आंकड़े नहीं पता होंगे? – Gumbo

संबंधित मुद्दे