MySQL
अनुक्रमित और कुंजी
खोज…
वाक्य - विन्यास
- सिंपल इंडेक्स बनाएं
बनाएँ सूचकांक INDEX_NAME पर TABLE_NAME (column_name1 [, column_name2, ...])
- यूनिक इंडेक्स बनाएं
UNIQUE INDEX index_name बनाएँ table_name ( column_name1 [, column_name2 , ...] पर
- ड्रॉप इंडेक्स
DROP INDEX index_name पर tbl_name [ algorithm_option | lock_option ] ...
एल्गोरिथ्मकॉप्शन: ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option: LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
टिप्पणियों
अवधारणाओं
MySQL टेबल में एक इंडेक्स एक किताब में एक इंडेक्स की तरह काम करता है।
मान लीजिए कि आपके पास डेटाबेस के बारे में एक पुस्तक है और आप संग्रहण, के बारे में कुछ जानकारी प्राप्त करना चाहते हैं। एक इंडेक्स के बिना (कोई अन्य सहायता नहीं, जैसे कि सामग्री की तालिका) आपको एक-एक करके पृष्ठों के माध्यम से जाना होगा, जब तक कि आपको विषय नहीं मिला (यह एक "पूर्ण तालिका स्कैन" है)। दूसरी ओर, एक इंडेक्स में कीवर्ड की एक सूची होती है, इसलिए आप इंडेक्स से परामर्श करेंगे और देखेंगे कि स्टोरेज 113-120, 231 और 354 पेजों पर उल्लिखित है। तब आप उन पेजों को बिना सर्च किए सीधे फ्लिप कर सकते हैं ( एक सूचकांक के साथ एक खोज, कुछ तेजी से)।
बेशक, सूचकांक की उपयोगिता कई चीजों पर निर्भर करती है - कुछ उदाहरण, ऊपर दिए गए उपमा का उपयोग करते हुए:
- यदि आपके पास डेटाबेस पर एक पुस्तक थी और "डेटाबेस" शब्द को अनुक्रमित किया गया था, तो आप देख सकते हैं कि इसका उल्लेख पृष्ठों 1-59, 61-290 और 292-400 पर किया गया है। यह बहुत सारे पृष्ठ हैं, और ऐसे मामले में, सूचकांक बहुत अधिक मदद नहीं करता है और यह एक-एक करके पृष्ठों के माध्यम से जाने के लिए तेज़ हो सकता है। (एक डेटाबेस में, यह "खराब चयनात्मकता" है।)
- 10-पृष्ठ की पुस्तक के लिए, इंडेक्स बनाने का कोई मतलब नहीं है, क्योंकि आप 10-पेज की किताब के साथ 5-पेज इंडेक्स द्वारा उपसर्ग कर सकते हैं, जो सिर्फ मूर्खतापूर्ण है - बस 10 पृष्ठों को स्कैन करें और उसके साथ करें ।
- इंडेक्स को भी उपयोगी होना चाहिए - आमतौर पर इंडेक्सिंग का कोई मतलब नहीं है, उदाहरण के लिए, प्रति पृष्ठ अक्षर "एल" की आवृत्ति।
सूचकांक बनाएँ
-- Create an index for column 'name' in table 'my_table'
CREATE INDEX idx_name ON my_table(name);
अद्वितीय सूचकांक बनाएँ
एक अद्वितीय सूचकांक एक तालिका में डुप्लिकेट किए गए डेटा के सम्मिलन को रोकता है। NULL
मान उन स्तंभों में डाले जा सकते हैं जो अद्वितीय अनुक्रमणिका का भाग बनाते हैं (क्योंकि, परिभाषा के अनुसार, NULL
मान किसी भी अन्य मान से भिन्न होता है, जिसमें अन्य NULL
मान भी शामिल है)
-- Creates a unique index for column 'name' in table 'my_table'
CREATE UNIQUE INDEX idx_name ON my_table(name);
ड्रॉप इंडेक्स
-- Drop an index for column 'name' in table 'my_table'
DROP INDEX idx_name ON my_table;
कम्पोजिट इंडेक्स बनाएं
यह एक समग्र दोनों चाबियाँ, के सूचकांक पैदा करेगा mystring
और mydatetime
में दोनों कॉलम के साथ प्रश्नों ऊपर और गति WHERE
खंड।
CREATE INDEX idx_mycol_myothercol ON my_table(mycol, myothercol)
नोट: आदेश महत्वपूर्ण है! यदि खोज क्वेरी में WHERE
क्लॉज़ में दोनों कॉलम शामिल नहीं हैं, तो यह केवल सबसे बाईं ओर के इंडेक्स का उपयोग कर सकता है। इस मामले में, WHERE
में mycol
साथ एक क्वेरी इंडेक्स का उपयोग करेगी, myothercol
खोज किए बिना एक क्वेरी भी mycol
नहीं mycol
। अधिक जानकारी के लिए इस ब्लॉग पोस्ट को देखें ।
नोट: बीटीआरईई के काम करने के तरीके के कारण, आमतौर पर रेंज में क्वेर किए जाने वाले कॉलम को सही मान में जाना चाहिए। उदाहरण के लिए, DATETIME
कॉलम सामान्य रूप से WHERE datecol > '2016-01-01 00:00:00'
। BTREE इंडेक्स की रेंज बहुत कुशलता से होती है, लेकिन केवल अगर रेंज के रूप में कॉलम को कंप्रेस किया जाता है, तो कंपोजिट इंडेक्स में अंतिम एक होता है।
AUTO_INCREMENT कुंजी
CREATE TABLE (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY(id),
... );
मुख्य नोट:
- जब आप
INSERT
पर इसे निर्दिष्ट करने में विफल होते हैं, या इसेNULL
रूप में निर्दिष्ट करते हैं, तो 1 से 1 और वेतन वृद्धि स्वचालित रूप से शुरू होतीNULL
। - आईडी हमेशा एक दूसरे से अलग होती हैं, लेकिन ...
- किसी भी पल में अद्वितीय होने के अलावा आईडी के मूल्यों के बारे में कोई धारणा (कोई अंतराल, लगातार उत्पन्न, पुन: उपयोग नहीं किया जाता है, आदि) न करें।
सूक्ष्म नोट:
- सर्वर के पुनरारंभ होने पर, 'अगला' मान
MAX(id)+1
रूप में 'कम्प्यूटेड' है। - यदि शटडाउन या क्रैश से पहले अंतिम ऑपरेशन उच्चतम आईडी को हटाना था, तो उस आईडी का पुन: उपयोग किया जा सकता है (यह इंजन-निर्भर है)। इसलिए, स्थायी रूप से अद्वितीय होने के लिए ऑटो_सिनरेसमेंट पर भरोसा न करें ; वे किसी भी क्षण केवल अद्वितीय हैं।
- मल्टी-मास्टर या क्लस्टर किए गए समाधानों के लिए,
auto_increment_offset
औरauto_increment_increment
देखें। -
PRIMARY KEY
रूप में कुछ और होना ठीक है और केवलINDEX(id)
। (यह कुछ स्थितियों में एक अनुकूलन है।) - "
PARTITION
कुंजी" के रूप मेंAUTO_INCREMENT
का उपयोग करना शायद ही कभी फायदेमंद होता है; कुछ अलग करें। - विभिन्न ऑपरेशन "बर्न" मान हो सकते हैं। ऐसा तब होता है जब वे पूर्व-आवंटित मूल्य (ओं) का उपयोग करते हैं, तो उनका उपयोग न करें:
INSERT IGNORE
(डुबकी कुंजी के साथ),REPLACE
(जोDELETE
प्लसINSERT
) और अन्य।ROLLBACK
आईडी में अंतराल का एक और कारण है। - प्रतिकृति में, आप आरोही क्रम में दासों पर पहुंचने के लिए आईडी पर भरोसा नहीं कर सकते। यद्यपि आईडी को लगातार क्रम में सौंपा गया है, InnoDB विवरण
COMMIT
क्रम में दासों को भेजे जाते हैं।