2009-02-18 12 views
37

इंडेक्स कीवर्ड का क्या अर्थ है और यह किस कार्य करता है? मैं समझता हूं कि यह पूछताछ तेज करने के लिए है, लेकिन मुझे पूरा यकीन नहीं है कि यह कैसे किया जा सकता है।MYSQL: तालिका बनाने में इंडेक्स कीवर्ड और इसका उपयोग कब करें

जब अनुक्रमित करने के लिए कॉलम का चयन कैसे करें?

सूचकांक उपयोग का एक नमूना में तालिका क्वेरी बनाने के नीचे दिखाया गया है:

CREATE TABLE `blog_comment` 
(
    `id` INTEGER NOT NULL AUTO_INCREMENT, 
    `blog_post_id` INTEGER, 
    `author` VARCHAR(255), 
    `email` VARCHAR(255), 
    `body` TEXT, 
    `created_at` DATETIME, 
    PRIMARY KEY (`id`), 
    INDEX `blog_comment_FI_1` (`blog_post_id`), 
    CONSTRAINT `blog_comment_FK_1` 
     FOREIGN KEY (`blog_post_id`) 
     REFERENCES `blog_post` (`id`) 
)Type=MyISAM 

;

उत्तर

32

मैं MySQL Reference Manual से How MySQL Uses Indexes पढ़ने की अनुशंसा करता हूं। यह बताता है कि इंडेक्स का उपयोग किया जाता है ...

  • WHERE खंड से मेल खाने वाली पंक्तियों को खोजने के लिए जल्दी से।
  • विचारों से पंक्तियों को खत्म करने के लिए।
  • जुड़ने पर अन्य तालिकाओं से पंक्तियों को पुनर्प्राप्त करने के लिए।
  • किसी विशिष्ट अनुक्रमित कॉलम के लिए MIN() या MAX() मान ढूंढने के लिए।
  • किसी तालिका को क्रमबद्ध या समूहित करने के लिए (कुछ स्थितियों के तहत)।
  • डेटा पंक्तियों से परामर्श किए बिना केवल अनुक्रमणिका का उपयोग करके प्रश्नों को अनुकूलित करने के लिए।

डेटाबेस में इंडेक्स एक पुस्तक में एक इंडेक्स की तरह काम करते हैं। आप जो पुस्तक खोज रहे हैं उसे आप जल्दी से ढूंढ सकते हैं, क्योंकि सूचकांक वर्णानुक्रम में सूचीबद्ध है। वर्णमाला सूची के बजाय, MySQL अपने सूचकांक को व्यवस्थित करने के लिए B-trees का उपयोग करता है, जो इसके उद्देश्यों के लिए तेज़ है (लेकिन मानव के लिए बहुत अधिक समय लेगा)।

अधिक अनुक्रमणिका का उपयोग करना अधिक जगह का उपयोग करना (साथ ही इंडेक्स को बनाए रखने का ओवरहेड) का उपयोग करना है, इसलिए यह उपरोक्त उपयोग मानदंडों को पूरा करने वाले कॉलम पर इंडेक्स का उपयोग करने के लिए वास्तव में लायक है।

आपके उदाहरण में, id और blog_post_id कॉलम दोनों इंडेक्स का उपयोग करते हैं (PRIMARY KEY एक अनुक्रमणिका भी है) ताकि एप्लिकेशन उन्हें तेज़ी से ढूंढ सके। id के मामले में, यह संभावना है कि यह उपयोगकर्ताओं को त्वरित रूप से टिप्पणी को संशोधित करने या हटाने की अनुमति देता है, और blog_post_id के मामले में, इसलिए एप्लिकेशन किसी दिए गए पोस्ट के लिए तुरंत सभी टिप्पणियां पा सकता है।

आप देखेंगे कि email कॉलम के लिए कोई अनुक्रमणिका नहीं है। इसका मतलब यह है कि किसी विशेष ई-मेल पते द्वारा सभी ब्लॉग पोस्टों की खोज में शायद काफी समय लगेगा। यदि किसी विशेष ई-मेल पते द्वारा सभी टिप्पणियों की खोज करना कुछ ऐसा है जो आप जोड़ना चाहते हैं, तो उसे उसमें एक इंडेक्स जोड़ने का अर्थ हो सकता है।

4

इस कीवर्ड का अर्थ है कि आप तालिका के साथ blog_post_id पर एक अनुक्रमणिका बना रहे हैं।

क्वेरी जो की तरह:

SELECT * 
FROM blog_comment 
WHERE blog_post_id = @id 

इस क्षेत्र पर खोज और तेजी से चलाने के लिए इस सूचकांक का प्रयोग करेंगे।

इसके अलावा, इस कॉलम पर foreign key है।

जब आप ब्लॉग पोस्ट को हटाने का निर्णय लेते हैं, तो डेटाबेस को इस तालिका के खिलाफ जांच करने की आवश्यकता होगी ताकि कोई अनाथ टिप्पणियां न हों। इंडेक्स इस चेक को भी तेज करेगा, इसलिए

DELETE 
FROM blog_post 
WHERE ... 

जैसे प्रश्न भी तेजी से चलेंगे।

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