हां।
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 सेकंड से कम है।जबकि हम गति में सापेक्ष अंतर को माप सकते हैं, गति में पूर्ण अंतर वास्तव में महत्वहीन है।
तो मैं दोहराना होगा:
- मापें, अनुमान या लगता नहीं है। आपके शिक्षित अनुमान बहुत समय से गलत होंगे। आपके द्वारा किए गए हर बदलाव से पहले और बाद में मापें, ताकि आप जान सकें कि इससे कितनी मदद मिली।
- अपना समय और ध्यान निवेश करें जहां आपको हिरन के लिए सबसे बड़ी धमाका मिलती है।
- छोटी चीजें पसीना न करें। बेशक, एक छोटे से अंतर पर्याप्त पुनरावृत्तियों के साथ जोड़ता है, लेकिन उन पुनरावृत्तियों को देखते हुए, अधिक पूर्ण लाभ के साथ एक प्रदर्शन सुधार अभी भी बेहतर है।
क्या आप "लाभ" के बारे में अधिक विशिष्ट हो सकते हैं? क्या आप अंतरिक्ष के लिए, प्रदर्शन के लिए, आसानी से उपयोग के लिए, या अद्वितीय मूल्यों की सीमा के लिए अनुकूलित करने की कोशिश कर रहे हैं? –
मैं मुख्य रूप से प्रदर्शन लाभों में रूचि रखता हूं क्योंकि अंतरिक्ष लगभग मुक्त है और 128 बिट मान वैल्यू रेंज को दोगुना कर देता है जिसे मैं प्राथमिक कुंजी के रूप में बिगिनट का उपयोग करता हूं। – Gumbo