2013-04-20 7 views
8

मेरे पास एक यूयूआईडी स्ट्रिंग है जिसे मैं अपनी माईएसQL टेबल प्राथमिक कुंजी के रूप में उपयोग करना चाहता हूं, यूयूआईडी 32 वर्ण हेक्साडेसिमल स्ट्रिंग है ('-' अक्षर छीनने के बाद)। इस तथ्य के कारण कि डेटाबेस में आपकी प्राथमिक कुंजी के रूप में एक संख्यात्मक कॉलम (int) का उपयोग करना बेहतर होता है, मैं इसे एक पूर्णांक में परिवर्तित करना चाहता हूं लेकिन इसे संभालने का सबसे अच्छा तरीका सुनिश्चित नहीं करता हूं।एक MySQL तालिका प्राथमिक कुंजी के रूप में बड़े (यूयूआईडी) को संभालने का सबसे अच्छा तरीका

  1. स्ट्रिंग (यानी। UUID = 'a822ff2bff02461db45ddcd10a2de0c2') के आकार के कारण, मैं कई 'सबस्ट्रिंग' में इस तोड़ने के लिए की जरूरत है।
  2. मैं इस समय 32 बिट आर्किटेक्चर पर PHP चला रहा हूं, इसलिए PHP के भीतर इसे परिवर्तित करना PHP_INT_MAX आकार (अधिकतम 0xFFFFFFFF) के कारण काम नहीं करेगा। और मुझे संदेह है कि MySQL के लिए एक ही प्रतिबंध होगा।
  3. मुझे इसके लिए एक फिक्स के रूप में कई प्राथमिक कुंजी के विचार पसंद नहीं हैं, मैं एक स्ट्रिंग प्रस्तुति का उपयोग करना चाहूंगा, भले ही यह पसंदीदा विधि न हो।

मैं इस सब गलत के बारे में सोच रहा हूं, और दस्तावेज़ीकरण पढ़ने के खिलाफ नहीं हूं, इसलिए उदाहरण के रूप में या प्रतिक्रिया के रूप में पढ़ने का सुझाव स्वीकार्य होगा।

+0

यह भी ध्यान देने के लिए, यह आईडी फ़ील्ड दोनों शामिल होने और चयन के लिए उपयोग किया जाएगा। –

उत्तर

25

के लिए प्रयोग किया जाता है यह सबसे अच्छा है BINARY(16) रूप UUIDs/GUIDs स्टोर करने के लिए देखने के लिए कर सकते हैं। इन संबंधित StackOverflow प्रश्न देखें:

रूपांतरण (और शायद चाहिए) पीएचपी के बजाय MySQL में किया जा सकता है इसलिए चाहे आप एक 32bit पीएचपी ग्राहक या 64bits का उपयोग कर रहे कोई फर्क नहीं पड़ता (पन इरादा: पी)

+0

यह वही लगता है जो मैं खोज रहा था। GUID/UUID मेरे द्वारा उत्पन्न नहीं होता है, इसे किसी तृतीय पक्ष स्रोत से खींचा जाता है। यह अद्वितीय है और प्राथमिक कुंजी के रूप में अच्छी तरह से कार्य करता है। @PaulProgrammer मैं भी आपके त्वरित उत्तरों की सराहना करता हूं, मैंने आप दोनों को +1 किया है। इन उत्तरों में मदद के लिए धन्यवाद। –

+0

@Hazzit - क्या आप जानते हैं कि UUID को MySQLi में bind_param विधि में स्ट्रिंग के रूप में बांधना कानूनी है और बस इसे बाइनरी (16) फ़ील्ड पर इंगित करें? मुझे यह पता लगाने में परेशानी हो रही है कि मुझे पहले कोई रूपांतरण करने की ज़रूरत है या नहीं। – nickdnk

1

एक स्ट्रिंग प्रकार का उपयोग करें, पूर्णांक नहीं। यदि यह कोई समस्या हल करता है तो बेहतर बेहतर होता है।

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

+0

मैंने पिछले परियोजनाओं में तारों का उपयोग किया है, और मेरा मानना ​​है कि (उत्पादन में) केवल उच्च संख्या के रूप में कई मिलियन रिकॉर्ड बोलेंगे, इसलिए मुझे लगता है कि यह एक बड़ी प्रदर्शन चिंता (तारों का उपयोग करके) नहीं है, मुझे पूरा यकीन नहीं है स्ट्रिंग बनाम न्यूमेरिक फ़ील्ड का उपयोग करने के साथ प्रदर्शन हिट किस आकार में खेलेंगे। आकार के आधार पर, मुझे पूरी तरह से यकीन नहीं है कि एक सिंथेटिक प्राथमिक कुंजी लाखों रिकॉर्ड (10 मिलियन शीर्ष) कहानियों में फायदेमंद होगी। –

+0

तो आप जो कह रहे हैं, यह संख्यात्मक प्रतिनिधित्व में आसानी से पैक/स्टोर करने का कोई वास्तविक तरीका नहीं है, मेरे विकल्प स्ट्रिंग्स और सिंथेटिक ऑटो-वृद्धि कुंजी के साथ तार हैं। –

+0

यह कोई समस्या नहीं है जब तक कि यह एक समस्या नहीं है। उत्पादन गुणवत्ता डेटाबेस (mysql शामिल) स्ट्रिंग प्रश्नों को संभालने के लिए बहुत चालाक अनुक्रमण एल्गोरिदम है। यदि आप अभी तक प्रदर्शन के बारे में चिंतित नहीं हैं, तो आप अपने मूल प्रश्न में अधिकतम पूर्णांक आकार की दीवार के खिलाफ अपने सिर को क्यों दबा रहे हैं? – PaulProgrammer

0

यह स्टोरेज इंजन पर भी निर्भर करता है। TokuDB इन सभी समस्याओं को संभालना चाहिए।

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