MySQL आपको पूर्वनिर्धारित सूचकांक को परिभाषित करने में सक्षम बनाता है जिसका अर्थ है कि आप मूल स्ट्रिंग से पहले एन वर्णों को अनुक्रमित करने के लिए परिभाषित करते हैं, और चाल एक संख्या एन को चुनने के लिए है जो अच्छी चयनात्मकता देने के लिए पर्याप्त है, लेकिन अंतरिक्ष को बचाने के लिए काफी कम है। उपसर्ग अनुक्रमणिका को लगभग उतना ही उपयोगी बनाने के लिए पर्याप्त होना चाहिए जितना कि यह होगा कि आप पूरे कॉलम को अनुक्रमित करेंगे।
इससे पहले कि हम आगे बढ़ें हम कुछ महत्वपूर्ण शब्दों को परिभाषित करें। सूचकांक चयनात्मकता कुल अलग-अलग अनुक्रमित मूल्यों और कुल पंक्तियों की संख्या का अनुपात है । यहाँ परीक्षण तालिका के लिए एक उदाहरण है:
+-----+-----------+
| 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)
यह बहुत अच्छे परिणाम हैं। इसका अर्थ है कि हम केवल 10 वर्णों के अनुक्रमण के साथ कॉलम last_name पर अनुक्रमणिका बना सकते हैं । तालिका परिभाषा कॉलम में last_name को VARCHAR(16)
इस रूप में परिभाषित किया गया है , और इसका अर्थ है कि हमने प्रति प्रविष्टि में 6 बाइट्स (या यदि अंतिम नाम में UTF8 वर्ण हैं) को सहेज लिया है। इस तालिका में १६३ distinct अलग-अलग मूल्य हैं जिन्हें ६ बाइट से गुणा किया जाता है, लगभग ९ केबी है, और कल्पना करें कि यदि हमारी तालिका में लाखों पंक्तियाँ हैं तो यह संख्या कैसे बढ़ेगी।
आप मेरी पोस्ट में N की संख्या की गणना करने के अन्य तरीकों को पढ़ सकते हैं MySQL में पूर्वनिर्धारित अनुक्रमित ।
MD5 और SHA1 फ़ंक्शन का उपयोग उन मूल्यों को उत्पन्न करने के लिए किया जाता है जिन्हें अनुक्रमित किया जाना चाहिए, यह भी अच्छा तरीका नहीं है । क्यूं कर? इसे पोस्ट में पढ़ें MySQL डेटाबेस में एक प्राथमिक कुंजी के लिए सही डेटा प्रकार कैसे चुनें