2012-06-08 18 views
71

प्रश्न के उत्तर के आधार पर, UUID performance in MySQL, जो व्यक्ति उत्तर देता है वह यूयूआईडी को एक संख्या के रूप में स्टोर करने का सुझाव देता है और एक स्ट्रिंग के रूप में नहीं। मुझे यकीन नहीं है कि यह कैसे किया जा सकता है। कोई मुझे कुछ सुझाव दे सकता है? मेरे रूबी कोड के साथ कैसे सौदा करते हैं?यूयूआईडी को संख्या के रूप में कैसे स्टोर करें?

+5

प्रदर्शन समस्या केवल तब उत्पन्न होती है जब आप यूयूआईडी प्राथमिक कुंजी का उपयोग कर रहे हैं, क्योंकि यूयूआईडी बहुत ही कुशल प्राथमिक कुंजी नहीं हैं। आपको यूयूआईडी की आवश्यकता क्यों है? क्या आप यूयूआईडी रख सकते हैं और केवल प्राथमिक कुंजी के रूप में एक ऑटोइनक्रिकमेंट का उपयोग कर सकते हैं? –

+3

@ थॉमस्मिथ रे "यूयूआईडी बहुत ही कुशल प्राथमिक कुंजी नहीं हैं" .. एक स्रोत का हवाला देते हुए बताते हैं कि क्यों? – Pacerier

+1

यह डेटा का एक बड़ा टुकड़ा है, और यह आमतौर पर तुलना करने के लिए और अधिक निर्देश लेगा। यह क्रमिक नहीं है, इसलिए अनुक्रमण का ओवरहेड थोड़ा अधिक है। और, ज़ाहिर है, यदि आप इसे 128-बिट संख्या के बजाय स्ट्रिंग के रूप में संग्रहीत कर रहे हैं, क्योंकि ओपी ऐसा लगता है, स्थिति खराब हो जाती है। यह एक भयानक कुंजी नहीं है, लेकिन जब तक ऐसा करने का कोई बाहरी कारण नहीं होता तब तक मैं इसका उपयोग नहीं करता। –

उत्तर

99

यदि मैं सही ढंग से समझता हूं, तो आप अपने प्राथमिक कॉलम में यूयूआईडी का उपयोग कर रहे हैं? लोग कहेंगे कि एक नियमित (पूर्णांक) प्राथमिक कुंजी तेज होगी, लेकिन 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 वर्ण लंबा है।

+0

अनहेक्स फ़ंक्शन का उपयोग करें परिणाम मानव अपठनीय है। – Chamnap

+0

@Chamnap UNHEX फ़ंक्शन आपके डेटाबेस में HEX को BINARY में परिवर्तित करेगा। इसके बाद आप किसी समस्या के बिना और प्रदर्शन के लाभ के साथ इंडेक्स का उपयोग कर सकते हैं (हाँ हाँ!)। फिर आप मेरे उदाहरण में 'HEX' फ़ंक्शन के साथ डेटा पढ़ते हैं। तो नहीं, आप 'UNHEX' से परिणाम नहीं पढ़ सकते हैं, लेकिन यदि आप' हेक्स 'का उपयोग कर सकते हैं। याद रखें कि कंप्यूटर बाइनरी से बना है, हमेशा तेज है। –

+3

@Chamnap मान लें कि आपके डेटाबेस में 10 000 पंक्तियां हैं और उन्हें यूएनएचएक्स फ़ंक्शन का उपयोग करके जोड़ा गया है और आप UUID '110E8400-E29B-11D4-A716-446655440000' खोजना चाहते हैं। बस कुछ ऐसा करें: 'चुनें * test_table से फ़ील्ड_बिनरी जैसे CONCAT ("%", UNHEX (' 110E8400E29B11D4A716446655440000 '), "%") ' –

7

परकोना ब्लॉग में एक लेख (जिसमें बेंचमार्क शामिल हैं) है जो आपके प्रश्न का उत्तर देता है: Store UUID in an optimized way

0

मुझे नहीं लगता कि बाइनरी का उपयोग करना एक अच्छा विचार है।

कहते हैं कि तुम कुछ मूल्य क्वेरी करने के लिए चाहते हैं:

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' 

सकता है कई समस्याओं को जन्म देता।

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