2008-09-22 3 views
20

से बेहतर क्यों है I मैंने अपनी तालिकाओं में से एक पर "प्रक्रिया विश्लेषण()" चलाया। और मेरे पास यह कॉलम है जो टाइप INT है और इसमें केवल 0 से 12 (श्रेणी आईडी) के मान शामिल हैं। और MySQL ने कहा कि मैं एक ईएनएन ('0', '1', '2', ..., '12') के साथ बेहतर होगा। यह श्रेणी मूल रूप से स्थैतिक है और भविष्य में नहीं बदलेगी, लेकिन यदि वे करते हैं तो मैं केवल उस कॉलम को बदल सकता हूं और इसे ENUM सूची में जोड़ सकता हूं ...ईएनटी

तो इस मामले में ENUM बेहतर क्यों है?

संपादित करें: मैं ज्यादातर इस बात का प्रदर्शन पहलू में दिलचस्पी रखता हूँ ...

उत्तर

27

बस रखें, ऐसा इसलिए है क्योंकि यह एक अलग तरीके से अनुक्रमित है।

इस मामले में, ENUM कहता है "यह 13 मानों में से एक है" जबकि INT कह रहा है "यह कोई पूर्णांक हो सकता है।"

इसका मतलब है कि अनुक्रमण आसान है, क्योंकि उन उन पूर्णांकों के लिए खाता इंडेक्सिंग नहीं लेना पड़ता है जिनका उपयोग आप "कभी भी" नहीं करते हैं, जिनका उपयोग आप कभी भी करते हैं।

यह सब एल्गोरिदम के साथ करना है।

मुझे अपने आप में रुचि होगी हालांकि यह उस बिंदु पर पहुंच जाएगा जहां INTENUM से तेज़ होगा।

ENUM में संख्याओं का उपयोग करना थोड़ा खतरनाक हो सकता है ... जैसे कि आप इस नंबर को एसक्यूएल के लिए अनिच्छुक भेजते हैं - तो आप गलत मूल्य वापस प्राप्त कर सकते हैं!

3

क्योंकि यह संभव मूल्यों पर एक बाधा प्रस्तुत करता है।

2

मैं एक MySQL विशेषज्ञ नहीं हूं, लेकिन मेरा अनुमान है कि पूर्णांक हमेशा चार बाइट्स स्पेस लेते हैं जहां एनम्स आवश्यक डेटा की सीमा के आधार पर अलग-अलग जगह लेते हैं। चूंकि आपको केवल 13 आइटम की आवश्यकता है, इसलिए यह आपके कॉलम के लिए 1 बाइट का उपयोग करने से दूर हो सकता है।

+0

आप 1-बाइट पूर्णांक (टिनिंट) का भी उपयोग कर सकते हैं – Zaffy

1

ओरेकल पर मेरे पास एक बिटमैप इंडेक्स होगा जो कि इतनी छोटी संख्या के मूल्यों के लिए हैश-आधारित लुकअप से बहुत तेज है। (इसलिए मुझे लगता है कि क्वेरी ऑप्टोमाइज़ेशन या इंडेक्सिंग में एक समान लाभ MySQL के लिए उपलब्ध है।)

दिलचस्प बात यह है कि MySQL दस्तावेज़ों का सुझाव है कि 'संख्याओं की तरह दिखने वाली चीज़ों' का उपयोग करना ENUM प्रकार के लिए एक खराब विकल्प है क्योंकि संभावित भ्रम की वजह से एनम वैल्यू और एनम इंडेक्स (http://dev.mysql.com/doc/refman/5.0/en/enum.html)।

18

यिक्स! ENUM फ़ील्ड में संख्याओं का उपयोग करने के साथ अस्पष्टताओं का एक गुच्छा है। सावधान रहे। एक पकड़ लिया मुझे याद है कि आप सूचकांक द्वारा ENUMS में मानों का उपयोग कर सकते है: अगर आपके enum ENUM('A', 'B', 'C', '1', '2, '3') है, तो इन दो प्रश्नों बहुत अलग हैं:

INSERT INTO TABLE (example_col) VALUES('1'); -- example_col == 1 
INSERT INTO TABLE (example_col) VALUES( 1 ); -- example_col == A 

मैं यह सोचते हैं रहा हूँ, क्योंकि यह मान्य मान को सीमित करता है सिफारिश जो टेबल में जा सकता है। उदाहरण के लिए, 13 डालने से डिफ़ॉल्ट विकल्प मिलना चाहिए।

INT के बजाय TINYINT का उपयोग करने के लिए बेहतर विकल्प होगा। UNSIGNED TINYINT की श्रेणी 0 से 255 है और केवल 1 byte to store लेती है। एक INT स्टोर करने के लिए 4 बाइट लेता है। यदि आप तालिका में आने वाले मानों को बाधित करना चाहते हैं, तो आप ON INSERT और ON UPDATE ट्रिगर जोड़ सकते हैं जो मानों की जांच करते हैं।

यदि आप ENUM और TINYINT के बीच प्रदर्शन अंतर के बारे में चिंतित हैं, तो आप अलग-अलग देखने के लिए हमेशा बेंचमार्क कर सकते हैं। This article कुछ हद तक प्रासंगिक लगता है।