MySQL एक पूर्ण मान को अनुक्रमणित करता है BLOB
, TEXT
और लंबे VARCHAR
कॉलम क्योंकि उनमें मौजूद डेटा बहुत बड़ा हो सकता है, और अंतर्निहित DB इंडेक्स बड़ा होगा, जिसका अर्थ इंडेक्स से कोई लाभ नहीं है।
MySQL के लिए आवश्यक है कि आप पहले N वर्णों को अनुक्रमित करने के लिए परिभाषित करें, और चाल एक संख्या N को चुनने के लिए है जो अच्छी चयनात्मकता देने के लिए पर्याप्त है, लेकिन अंतरिक्ष को बचाने के लिए काफी कम है। उपसर्ग अनुक्रमणिका को लगभग उतना ही उपयोगी बनाने के लिए पर्याप्त होना चाहिए जितना कि यह होगा कि आप पूरे स्तंभ को अनुक्रमित करेंगे।
इससे पहले कि हम आगे बढ़ें हम कुछ महत्वपूर्ण शब्दों को परिभाषित करें। सूचकांक चयनात्मकता कुल अलग-अलग अनुक्रमित मूल्यों और पंक्तियों की कुल संख्या का अनुपात है । यहाँ परीक्षण तालिका के लिए एक उदाहरण है:
+-----+-----------+
| id | value |
+-----+-----------+
| 1 | abc |
| 2 | abd |
| 3 | adg |
+-----+-----------+
यदि हम केवल पहले वर्ण (N = 1) को अनुक्रमित करते हैं, तो सूचकांक तालिका निम्न तालिका की तरह दिखाई देगी:
+---------------+-----------+
| indexedValue | rows |
+---------------+-----------+
| a | 1,2,3 |
+---------------+-----------+
इस मामले में, सूचकांक चयनात्मकता आईएस = 1/3 = 0.33 के बराबर है।
आइए अब देखते हैं कि यदि हम अनुक्रमित वर्णों की संख्या को दो (N = 2) तक बढ़ाते हैं तो क्या होगा।
+---------------+-----------+
| indexedValue | rows |
+---------------+-----------+
| ab | 1,2 |
| ad | 3 |
+---------------+-----------+
इस परिदृश्य में IS = 2/3 = 0.66 जिसका अर्थ है कि हमने इंडेक्स चयनात्मकता में वृद्धि की है, लेकिन हमने इंडेक्स का आकार भी बढ़ाया है। ट्रिक न्यूनतम संख्या एन को खोजने के लिए है जिसके परिणामस्वरूप अधिकतम सूचकांक चयनात्मकता होगी ।
दो दृष्टिकोण हैं जो आप अपने डेटाबेस तालिका के लिए गणना कर सकते हैं। मैं इस डेटाबेस डंप पर प्रदर्शन करूंगा ।
मान लें कि हम तालिका कर्मचारियों में तालिका last_name को अनुक्रमणिका में जोड़ना चाहते हैं , और हम सबसे छोटी संख्या N को परिभाषित करना चाहते हैं जो सर्वोत्तम सूचकांक चयनात्मकता का उत्पादन करेगा।
पहले हमें सबसे अंतिम नामों की पहचान करें:
select count(*) as cnt, last_name
from employees
group by employees.last_name
order by cnt
+-----+-------------+
| cnt | last_name |
+-----+-------------+
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Farris |
| 222 | Sudbeck |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Neiman |
| 218 | Mandell |
| 218 | Masada |
| 217 | Boudaillier |
| 217 | Wendorf |
| 216 | Pettis |
| 216 | Solares |
| 216 | Mahnke |
+-----+-------------+
15 rows in set (0.64 sec)
जैसा कि आप देख सकते हैं, अंतिम नाम बाबा सबसे अधिक बार है। अब हम पांच अक्षर वाले उपसर्गों के साथ सबसे अधिक बार होने वाले last_name उपसर्गों को खोजने जा रहे हैं ।
+-----+--------+
| cnt | prefix |
+-----+--------+
| 794 | Schaa |
| 758 | Mande |
| 711 | Schwa |
| 562 | Angel |
| 561 | Gecse |
| 555 | Delgr |
| 550 | Berna |
| 547 | Peter |
| 543 | Cappe |
| 539 | Stran |
| 534 | Canna |
| 485 | Georg |
| 417 | Neima |
| 398 | Petti |
| 398 | Duclo |
+-----+--------+
15 rows in set (0.55 sec)
हर उपसर्ग की बहुत अधिक घटनाएं होती हैं, जिसका अर्थ है कि हमें संख्या एन को बढ़ाना होगा जब तक कि मान लगभग पिछले उदाहरण के समान न हों।
यहाँ एन = 9 के लिए परिणाम हैं
select count(*) as cnt, left(last_name,9) as prefix
from employees
group by prefix
order by cnt desc
limit 0,15;
+-----+-----------+
| cnt | prefix |
+-----+-----------+
| 336 | Schwartzb |
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Sudbeck |
| 222 | Farris |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Mandell |
| 218 | Neiman |
| 218 | Masada |
| 217 | Wendorf |
| 217 | Boudailli |
| 216 | Cummings |
| 216 | Pettis |
+-----+-----------+
यहाँ एन = 10 के लिए परिणाम हैं।
+-----+------------+
| cnt | prefix |
+-----+------------+
| 226 | Baba |
| 223 | Coorg |
| 223 | Gelosh |
| 222 | Sudbeck |
| 222 | Farris |
| 221 | Adachi |
| 220 | Osgood |
| 218 | Mandell |
| 218 | Neiman |
| 218 | Masada |
| 217 | Wendorf |
| 217 | Boudaillie |
| 216 | Cummings |
| 216 | Pettis |
| 216 | Solares |
+-----+------------+
15 rows in set (0.56 sec)
यह बहुत अच्छे परिणाम हैं। इसका अर्थ है कि हम last_name
केवल 10 वर्णों के अनुक्रमण के साथ स्तंभ पर अनुक्रमणिका बना सकते हैं । तालिका में परिभाषा कॉलम last_name
के रूप में परिभाषित किया गया है VARCHAR(16)
, और इसका मतलब है कि हमने प्रति प्रविष्टि में 6 बाइट्स (या यदि अंतिम नाम में UTF8 वर्ण हैं) को सहेज लिया है। इस तालिका में १६३ distinct अलग-अलग मान हैं जो ६ बाइट से गुणा होता है, लगभग ९ केबी है, और कल्पना करें कि यदि हमारी तालिका में लाखों पंक्तियाँ हैं तो यह संख्या कैसे बढ़ेगी।
आप की संख्या की गणना करने के अन्य तरीकों पढ़ सकते हैं एन अपनी पोस्ट में MySQL में पहले से जुड़ा हुआ अनुक्रमित ।
UNIQUE
कुंजियाँ हैं?