प्रश्न के उत्तर के आधार पर, UUID performance in MySQL, जो व्यक्ति उत्तर देता है वह यूयूआईडी को एक संख्या के रूप में स्टोर करने का सुझाव देता है और एक स्ट्रिंग के रूप में नहीं। मुझे यकीन नहीं है कि यह कैसे किया जा सकता है। कोई मुझे कुछ सुझाव दे सकता है? मेरे रूबी कोड के साथ कैसे सौदा करते हैं?यूयूआईडी को संख्या के रूप में कैसे स्टोर करें?
उत्तर
यदि मैं सही ढंग से समझता हूं, तो आप अपने प्राथमिक कॉलम में यूयूआईडी का उपयोग कर रहे हैं? लोग कहेंगे कि एक नियमित (पूर्णांक) प्राथमिक कुंजी तेज होगी, लेकिन MySQL के अंधेरे पक्ष का उपयोग करने का एक और तरीका है। असल में, इंडेक्स की आवश्यकता होने पर माईएसक्यूएल बाइनरी का उपयोग करके किसी और चीज से तेज है।
चूंकि यूयूआईडी 128 बिट्स है और हेक्साडेसिमल के रूप में लिखा गया है, तो यूयूआईडी को तेज़ और स्टोर करना बहुत आसान है।
पहले, अपने प्रोग्रामिंग भाषा में 110E8400E29B11D4A716446655440000
करने के लिए 110E8400-E29B-11D4-A716-446655440000
से डैश
को हटा दें।
अब यह 32 वर्ण हैं (जैसे एमडी 5 हैश, जो यह भी काम करता है)।
चूंकि MySQL में एक BINARY
आकार में 8 बिट्स है, BINARY(16)
एक यूयूआईडी (8 * 16 = 128) का आकार है। का उपयोग कर
INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))
और क्वेरी:
आप का उपयोग कर सम्मिलित कर सकते हैं
SELECT HEX(FieldBin) AS FieldBin FROM Table
, पदों 9, 14, 19 में डैश फिर से डालने और 24 आपके मूल यूयूआईडी से मेल खाता है। यदि पद हमेशा अलग होते हैं तो आप उस जानकारी को दूसरे फ़ील्ड में स्टोर कर सकते हैं।
पूर्ण उदाहरण:
CREATE TABLE `test_table` (
`field_binary` BINARY(16) NULL ,
PRIMARY KEY ( `field_binary`)
) ENGINE = INNODB ;
INSERT INTO `test_table` (
`field_binary`
)
VALUES (
UNHEX( '110E8400E29B11D4A716446655440000')
);
SELECT HEX(field_binary) AS field_binary FROM `test_table`
आप किसी भी हेक्स तार के साथ इस तकनीक का उपयोग करना चाहते हैं, हमेशा क्षेत्र लंबाई के लिए length/2
है। तो sha512 के लिए, फ़ील्ड BINARY (64)
होगा क्योंकि sha512 एन्कोडिंग 128 वर्ण लंबा है।
अनहेक्स फ़ंक्शन का उपयोग करें परिणाम मानव अपठनीय है। – Chamnap
@Chamnap UNHEX फ़ंक्शन आपके डेटाबेस में HEX को BINARY में परिवर्तित करेगा। इसके बाद आप किसी समस्या के बिना और प्रदर्शन के लाभ के साथ इंडेक्स का उपयोग कर सकते हैं (हाँ हाँ!)। फिर आप मेरे उदाहरण में 'HEX' फ़ंक्शन के साथ डेटा पढ़ते हैं। तो नहीं, आप 'UNHEX' से परिणाम नहीं पढ़ सकते हैं, लेकिन यदि आप' हेक्स 'का उपयोग कर सकते हैं। याद रखें कि कंप्यूटर बाइनरी से बना है, हमेशा तेज है। –
@Chamnap मान लें कि आपके डेटाबेस में 10 000 पंक्तियां हैं और उन्हें यूएनएचएक्स फ़ंक्शन का उपयोग करके जोड़ा गया है और आप UUID '110E8400-E29B-11D4-A716-446655440000' खोजना चाहते हैं। बस कुछ ऐसा करें: 'चुनें * test_table से फ़ील्ड_बिनरी जैसे CONCAT ("%", UNHEX (' 110E8400E29B11D4A716446655440000 '), "%") ' –
परकोना ब्लॉग में एक लेख (जिसमें बेंचमार्क शामिल हैं) है जो आपके प्रश्न का उत्तर देता है: Store UUID in an optimized way।
मुझे नहीं लगता कि बाइनरी का उपयोग करना एक अच्छा विचार है।
कहते हैं कि तुम कुछ मूल्य क्वेरी करने के लिए चाहते हैं:
SELECT HEX(field_binary) AS field_binary FROM `test_table`
हम कई मूल्यों तो हम हेक्स समारोह कई बार फोन कर रहे लौट रहे हैं।
हालांकि, मुख्य समस्या यह है कि अगले एक है:
SELECT * FROM `test_table`
where field_binary=UNHEX('110E8400E29B11D4A716446655440000')
और जहां के अंदर एक समारोह का उपयोग कर, बस सूचकांक पर ध्यान नहीं देता।
इसके अलावा
SELECT * FROM `test_table`
where field_binary=x'[email protected]#*#(&#@$9'
सकता है कई समस्याओं को जन्म देता।
- 1. एक स्थिर पुस्तकालय में संस्करण संख्या को कैसे स्टोर करें?
- 2. FontFamily को StaticResource के रूप में कैसे स्टोर करें?
- 3. स्टोर संख्या
- 4. प्रतिशत के रूप में लंबी लंबी संख्या को विभाजित करें
- 5. फ़ाइल में java.util.prefs.Preferences को कैसे स्टोर करें?
- 6. DynamoDB के लिए यूयूआईडी?
- 7. एक्सएसएलटी यूयूआईडी
- 8. mysql में सरणी को कैसे स्टोर करें?
- 9. JSON को RavenDB में कैसे स्टोर करें?
- 10. प्रिंटस्टैकट्रेस को स्ट्रिंग में कैसे स्टोर करें
- 11. recv() के आउटपुट को कैसे स्टोर करें?
- 12. डेटाबेस के रूप में NSUserDefaults में मानों को कैसे स्टोर करें?
- 13. विभिन्न मोबाइल ऐप स्टोर में ऐप्स को प्रोग्रामेटिक रूप से सबमिट, प्रकाशित और अपग्रेड कैसे करें?
- 14. SQLite में JSON को स्टोर करने के लिए कैसे करें
- 15. स्टोर _Id मोंगोडीबी में ऑब्जेक्ट या स्ट्रिंग के रूप में स्टोर करें?
- 16. डेटाबेस में उपयोगकर्ता के पैसे को कैसे स्टोर करें?
- 17. एनएसएमयूटेबलएरे में CGGradientRef को स्टोर करने के लिए कैसे करें
- 18. MySQL - AES_Encrypted डेटा को कैसे स्टोर करें?
- 19. पोस्टग्रेस + हाइबरनेट + जावा यूयूआईडी
- 20. डेटा स्टोर के रूप में ल्यूसीन
- 21. डिस्क पर छवि फ़ाइल के रूप में बाइट सरणी को कैसे स्टोर करें?
- 22. अधिक सामान्य तरीके से, ShareStreferences को स्थानीय स्टोर के रूप में कैसे उपयोग करें?
- 23. दस्तावेज़ स्टोर डेटाबेस के रूप में हैडोप
- 24. स्टोर में कस्टम गुणों को स्टोर करें Context.xml स्प्रिंग फ़ाइल
- 25. एमुलेटर पर फ़ाइलों को कैसे स्टोर करें?
- 26. सी के लिए यूयूआईडी पुस्तकालय?
- 27. पैसे के रूप में प्रारूप संख्या
- 28. स्वरूपण संख्या प्रतिशत के रूप में
- 29. बिडरेक्शनल रिश्तों को कैसे स्टोर करें
- 30. Android को ऐप स्टोर में रीडायरेक्ट करें
प्रदर्शन समस्या केवल तब उत्पन्न होती है जब आप यूयूआईडी प्राथमिक कुंजी का उपयोग कर रहे हैं, क्योंकि यूयूआईडी बहुत ही कुशल प्राथमिक कुंजी नहीं हैं। आपको यूयूआईडी की आवश्यकता क्यों है? क्या आप यूयूआईडी रख सकते हैं और केवल प्राथमिक कुंजी के रूप में एक ऑटोइनक्रिकमेंट का उपयोग कर सकते हैं? –
@ थॉमस्मिथ रे "यूयूआईडी बहुत ही कुशल प्राथमिक कुंजी नहीं हैं" .. एक स्रोत का हवाला देते हुए बताते हैं कि क्यों? – Pacerier
यह डेटा का एक बड़ा टुकड़ा है, और यह आमतौर पर तुलना करने के लिए और अधिक निर्देश लेगा। यह क्रमिक नहीं है, इसलिए अनुक्रमण का ओवरहेड थोड़ा अधिक है। और, ज़ाहिर है, यदि आप इसे 128-बिट संख्या के बजाय स्ट्रिंग के रूप में संग्रहीत कर रहे हैं, क्योंकि ओपी ऐसा लगता है, स्थिति खराब हो जाती है। यह एक भयानक कुंजी नहीं है, लेकिन जब तक ऐसा करने का कोई बाहरी कारण नहीं होता तब तक मैं इसका उपयोग नहीं करता। –