12

एक सवाल:प्राकृतिक कुंजी बनाम किराए की कुंजी एक InnoDB विदेशी कुंजी

2 टेबल है:

Product 
id INT 
name VARCHAR(64) 
something TEXT 
else INT 
entirely BOOL 

और

Ingredient 
id INT 
name VARCHAR(64) 
description TEXT 

अब मैं भी एक लिंक तालिका

Products_Ingredients 
product_id INT 
ingredient_id INT 
है

मेरे कई लोगों के लिए कई संबंधों के लिए ।

अब दोनों उत्पादों और सामग्रियों के अद्वितीय नाम होंगे। तो मैं प्राकृतिक कुंजी के रूप में नामों का उपयोग कर सकता हूं ... हालांकि यह एक अच्छा विचार होगा?

मैं एक उत्पाद है कहते हैं: Paint Thinner Supreme घटक के साथ: Butylonitrotetrocycline

कि एक अच्छा विचार लिंक तालिका में समग्र कुंजी के रूप में उन नामों का उपयोग करने होंगे?

जितना मुझे किराए की कोख से अधिक प्राकृतिक कुंजियों का उपयोग करने के पीछे विचार को समझने के रूप में, मैं थोड़े यह सोच कर कि सरल पूर्णांकों का उपयोग कर प्राथमिक कुंजी (और विदेशी वाले) बहुत तेजी से हो जाएगा के रूप में नहीं रोक सकता। क्या एक ऐसे तरीके में कोई अंतर आएगा जिसमें MySQL सर्वर उन अलग-अलग कुंजियों को पचता है?

आपकी राय क्या है?

उत्तर

16

विचार बात आप जब माप सकते हैं नहीं है हो सकता है।

मैं दोनों प्राकृतिक कुंजी और किराए की कोख का उपयोग कर PostgreSQL पर इस कार्यान्वित किया। मैंने 100,000 यादृच्छिक रूप से चुने गए उत्पादों (1053462 पंक्तियों) के लिए प्रति उत्पाद 3 से 17 अवयवों के साथ 300,000 कुल उत्पाद, 180 अवयवों और दो "उत्पाद घटक" तालिकाओं का उपयोग किया।

चयन सब एक एकल उत्पाद प्राकृतिक कुंजियों का उपयोग के लिए सामग्री 0.067 एमएस में लौट आए। सरोगेट्स का उपयोग, 0.1 99 एमएमएस।

0.145 एमएस में प्राकृतिक कुंजी का उपयोग कर एक ही उत्पाद के लिए सभी गैर-आईडी कॉलम लौटाना। किराए की कोख का उपयोग करना, 0.222 एमएस

तो प्राकृतिक कुंजियों के बारे में 2 से 3 गुना इस डेटा सेट पर तेजी से कर रहे थे।

प्राकृतिक कुंजी किसी भी इस डेटा लौटाने के लिए मिलती है आवश्यकता नहीं है। सरोगेट कुंजियों को दो जोड़ों की आवश्यकता होती है।

वास्तविक प्रदर्शन अंतर अपने टेबल, पंक्तियाँ, पृष्ठ आकार, और नामों की लंबाई की संख्या, और कहा कि जैसी चीजों की चौड़ाई पर निर्भर करता है। एक ऐसा बिंदु होगा जहां सरोगेट कुंजी प्राकृतिक चाबियों से बेहतर प्रदर्शन शुरू कर देगी, लेकिन कुछ लोग इसे मापने की कोशिश करते हैं।

जब मैं अपने नियोक्ता के परिचालन डेटाबेस के लिए डेटाबेस डिज़ाइन कर रहा था, तो मैंने प्राकृतिक कुंजी के चारों ओर डिज़ाइन की गई टेबल और आईडी संख्याओं के चारों ओर डिज़ाइन की गई टेबल के साथ टेस्टबेड बनाया। उन दोनों स्कीमा में कंप्यूटर से उत्पन्न नमूना डेटा की 13 मिलियन से अधिक पंक्तियां हैं। कुछ मामलों में, आईडी संख्या स्कीमा पर प्रश्नों ने प्राकृतिक कुंजी स्कीमा को 50% से बेहतर प्रदर्शन किया। (इसलिए एक जटिल क्वेरी जिसमें आईडी संख्याओं के साथ 20 सेकंड लग गए, प्राकृतिक चाबियों के साथ 30 सेकंड लग गए।) लेकिन 80% परीक्षण प्रश्नों में प्राकृतिक कुंजी स्कीमा के खिलाफ तेजी से चयन प्रदर्शन था। और कभी-कभी यह चौंकाने वाला तेज़ था - 30 से 1.

का अंतर हम उम्मीद करते हैं कि प्राकृतिक कुंजी आने वाले वर्षों में हमारे डेटाबेस में सरोगेट्स को बेहतर प्रदर्शन करेगी। (जब तक हम कुछ टेबल को एसएसडी पर नहीं ले जाते, तब तक प्राकृतिक चाबियाँ हमेशा के लिए सरोगेट्स को बेहतर प्रदर्शन करती हैं।)

+0

अच्छा स्पष्टीकरण, धन्यवाद। – RandomWhiteTrash

3

इस मामले के लिए मैं prefere होता किराए की कुंजी है क्योंकि

  1. एक उत्पाद या एक घटक के नाम बदल सकते हैं, खासकर अगर अपनी सामग्री उपयोगकर्ता उत्पन्न होता है (उदाहरण के लिए लिखने की त्रुटियों या वहाँ एक आइटम के लिए कई संभावित नाम हैं)
  2. अपने प्राकृतिक कुंजी की तुलना में बहुत लंबे समय तक हो जाएगा और इसलिए कम कुशल
+0

+1 इस तथ्य पर मेरा ध्यान बदलने के लिए कि नाम बदल सकते हैं/टाइप हो सकते हैं। अच्छी बात। – RandomWhiteTrash

+2

आह, लेकिन यह कैस्केडिंग अपडेट्स के लिए है: स्वचालित रूप से विदेशी प्राकृतिक कुंजी का नामकरण। – RsrchBoy

+0

अच्छा बिंदु RarchBoy, उम्मीद है कि कुंजी बहुत अधिक डेटा से संबंधित नहीं है। – fabspro

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