2009-04-19 5 views
46

क्या परिस्थितियों में enum का उपयोग करने के लिए कोई प्रदर्शन लाभ है जहां फ़ील्ड के लिए केवल 5-10 अलग-अलग संभावित मान हैं? अगर नहीं तो क्या फायदा है?MySQL Enum प्रदर्शन लाभ?

उत्तर

39

वहाँ एक विशाल प्रदर्शन दंड जैसे कार्यों के लिए ENUM का उपयोग कर रहा है:

  • क्वेरी ENUM में अनुमति दी मानों की सूची, उदाहरण के लिए एक ड्रॉप-डाउन मेनू को भरने के लिए। आपको INFORMATION_SCHEMA से डेटा प्रकार से पूछताछ करना होगा, और लौटाए गए बीएलओबी फ़ील्ड से सूची को पार्स करना होगा।

  • अनुमत मूल्यों के सेट को बदलें। इसके लिए ALTER TABLE कथन की आवश्यकता है, जो तालिका को ताला लगाता है और पुनर्गठन कर सकता है।

मैं MySQL के ENUM का प्रशंसक नहीं हूं। मैं लुकअप टेबल का उपयोग करना पसंद करता हूं। यह भी देखें "How to handle enumerations without enum fields in a database?"

+4

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

+33

"मेरे enum मूल्य ... कभी नहीं बदलेगा"। ** ** कुछ आंकड़े प्राप्त करने के लिए ** प्यार करें कि कितनी बार यह कथन गलत साबित हुआ है। – benmarks

+2

जबकि सूचीबद्ध बुलेट बिंदु सत्य हैं, ENUM अभी भी जॉइन से तेज़ है, खासकर यदि आप उस कॉलम द्वारा ऑर्डर कर रहे हैं। सेट वैल्यू वाले लिंग जैसे स्तंभों के लिए जो बदले नहीं जाते हैं, मैं ENUM का उपयोग करना पसंद करता हूं। यदि यहां तक ​​कि एक दूरस्थ संभावना भी है कि आपको मूल्यों को जोड़ने या हटाने की आवश्यकता होगी, तो जॉइन के साथ जाएं या एक चार्ज/वर्चर/टिन्यिनट का उपयोग करें और उन्हें एप्लिकेशन स्तर पर प्रबंधित करें। एक और बात ... MySQL स्तंभ में वास्तविक मान को संग्रहीत नहीं करता है, केवल एक अनुक्रमणिका (आईएनटी), ताकि आप अपने उपयोगकर्ताओं को प्रदर्शित करने के लिए पूर्ण पाठ स्ट्रिंग का भी उपयोग कर सकें (यानी एम के बजाय पुरुष) और अतिरिक्त बचत करें कोडिंग।;-) – Jabari

1

नहीं, एक तुलना here

लाभ कोड पठनीयता में देता है देखते हैं।

+10

आपके द्वारा लिंक किए गए लेख के अनुसार ENUM का उपयोग करने के लिए एक प्रदर्शन लाभ है जब तक आप संभावित राज्यों को परिवर्तित नहीं कर रहे हैं। –

24

मूल्यों की संख्या के आधार पर ईएनएन आंतरिक रूप से 1 या 2 बाइट द्वारा दर्शाए जाते हैं। यदि आप जो स्ट्रिंग्स स्टोर कर रहे हैं वे 2 बाइट से बड़े हैं और शायद ही कभी बदलते हैं, तो एक ईएनएन जाने का रास्ता है। तुलना एक enum के साथ तेजी से हो जाएगा और वे डिस्क पर कम जगह लेते हैं, जो बदले में तेजी से समय तलाश सकता है।

नकारात्मकता यह है कि जब मूल्यों को जोड़ने/हटाने की बात आती है तो enums कम लचीला होता है।

+0

मुझे यकीन नहीं है कि MySQL का कौन सा संस्करण आप का जिक्र कर रहे थे। लेकिन 5.0 के बाद से, एनम प्रकार का आकार या तो 1 या 2 बाइट मैन्युअल के अनुसार संभावित मानों की संख्या पर निर्भर करता है: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html चूंकि केवल 5 से 10 संभावित मान हैं, आकार 1 बाइट – Lacek

+0

@Lacek होना चाहिए आप सही हैं! मैं 16-बिट्स से 1 या 2 बाइट्स –

9

इस आलेख में http://fernandoipar.com/2009/03/09/using-the-enum-data-type-to-increase-performance/ फर्नांडो प्रश्नों के लिए एनम प्रकार के प्रदर्शन में दिखता है।

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

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

  • कोई संबंधित समस्या नहीं^_^