2011-08-31 22 views
12

मैं एक MySQL डेटाबेस में निम्न तालिका है:एकाधिक स्तंभ सूचकांक एकाधिक इंडेक्स बनाम

CREATE TABLE `secondary_images` (
    `imgId` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `primaryId` int(10) unsigned DEFAULT NULL, 
    `view` varchar(255) DEFAULT NULL, 
    `imgURL` varchar(255) DEFAULT NULL, 
    `imgDate` datetime DEFAULT NULL, 
    PRIMARY KEY (`imgId`), 
    KEY `primaryId` (`primaryId`), 
    KEY `imgDate` (`imgDate`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 

एसक्यूएल निम्नलिखित होगा: आप देख सकते हैं मैं बनाया

SELECT imgURL, view FROM secondary_images 
WHERE primaryId={$imgId} ORDER BY imgDate DESC 

दोनों primaryId और imgDate, इंडेक्स कुंजी। इसके पीछे मेरी सोच थी क्योंकि WHERE क्लॉज क्वेरी primaryId का उपयोग करके परिणाम देती है, और ORDER क्लॉज imgDate का उपयोग करता है।

मेरा सवाल है, क्या मैं अभी कई इंडेक्स का उपयोग करना बेहतर होगा? या मुझे एक बहु स्तंभ सूचकांक चाहिए (कुछ समय मैं इस समय बहुत अच्छी तरह से समझ नहीं पा रहा हूं)?

यह मैं क्या से मिलता है, इसकी व्याख्या:

id = 1 
select_type = simple  
table = secondary_images   
type = ref 
possible_keys = primaryId 
key = primaryId 
key_len = 5 
ref = const 
rows = 1 
extra = Using where; Using filesort 

नोट: यह एक एकाधिक स्तंभ सूचकांक का उपयोग नहीं कर रहा है, यह उपरोक्त तालिका वर्णन का उपयोग करने से परिणाम है।

+0

क्या आप चयन के लिए EXPLAIN पोस्ट कर सकते हैं? :) – Konerak

+2

ध्यान रखें कि indeces मुक्त नहीं हैं। यदि आपके पास एकाधिक इंडेक्स हैं, तो इसका मतलब प्रत्येक डालने या अपडेट पर है, प्रत्येक इंडेक्स को अपडेट करने की आवश्यकता है। आपको पुनर्प्राप्ति पर दिखाई देने वाले प्रदर्शन सुधार के उन अपडेट के प्रदर्शन हिट का वजन करना होगा। – Marvo

+0

यह भी याद रखें कि यदि आपके पास एक स्तंभ है जिसमें कई पंक्तियों में समान मूल्य है, तो इंडेक्स वास्तव में प्रदर्शन को और भी खराब कर सकता है। – Poodlehat

उत्तर

13

आपको एक बहु-कॉलम इंडेक्स (प्राथमिक आईडी, imgDate) पर उपयोग करना चाहिए ताकि MySQL पंक्तियों और सॉर्टिंग का चयन करने के लिए इसका उपयोग कर सके। अगर वहाँ नहीं है बहुत ज्यादा पंक्तियों

सभी छँटाई के लिए इस्तेमाल किया कॉलम चयन के लिए इस्तेमाल किया सूचकांक में नहीं हैं, तो MySQL "filesort" रणनीति, सभी पंक्तियों (छँटाई स्मृति में होते हैं जो उपयोग करता है, किसी और डिस्क पर)।

यदि सॉर्टिंग के लिए उपयोग किए जाने वाले सभी कॉलम इंडेक्स में हैं, तो MySQL पंक्तियों के क्रम (कुछ प्रतिबंधों के साथ) प्राप्त करने के लिए इंडेक्स का उपयोग करता है।

MySQL अनुक्रमणिका के लिए एक पेड़ संरचना का उपयोग करता है। यह सीधे क्रमबद्ध किए बिना क्रम में कुंजी तक पहुंचने की अनुमति देता है।

एक बहु-स्तंभ सूचकांक मूल रूप से कॉलम के समामेलन का एक सूचकांक है। यह MySQL को primaryId={$imgId} से मेल खाने वाली पहली पंक्ति ढूंढने की अनुमति देता है, और उसके बाद सभी अन्य पंक्तियों को सीधे सही क्रम में एक्सेस करता है।

primaryId पर एकल पंक्ति सूचकांक के साथ, MySQL primaryId={$imgId} से मेल खाने वाली सभी पंक्तियां पा सकता है, लेकिन यह पंक्तियों को किसी विशेष क्रम में नहीं मिलेगा; तो इसके बाद उन्हें क्रमबद्ध करना होगा।

EXPLAIN और ORDER BY Optimization देखें।

+0

मुझे समझ में नहीं आता क्यों - यह एक स्तंभ को दूसरे से तुलना कर रहा है, दो स्तंभों के साथ-साथ दो कॉलम नहीं। क्या तुम समझा सकते हो? – Poodlehat

+0

@ arnaud576875 - बहुत बहुत धन्यवाद! किसी भी मौके पर आप मुझे एक संक्षिप्त स्पष्टीकरण दे सकते हैं कि इस स्थिति में यह सबसे अच्छा विकल्प क्यों है? साथ ही, मैं 'प्राथमिक आईडी, imgDate)' पर बहु-कॉलम इंडेक्स का उपयोग करने के लिए 'SQL' का उपयोग करके अपनी वर्तमान तालिका को बदलने के बारे में कैसे जाउंगा? – stefmikhail

+0

@Poodlehat, stefmikhail मैंने जवाब – arnaud576875

11

इस तरह आपका दिखता है समझाने:

[id] => 1 
[select_type] => SIMPLE 
[table] => secondary_images 
[type] => ref 
[possible_keys] => primaryId 
[key] => primaryId 
[key_len] => 5 
[ref] => const 
[rows] => 1 
[Extra] => Using where; Using filesort 

की यह देखते हैं।

[id] => 1 

मतलब हम पहली तालिका के बारे में बात कर रहे हैं। आप केवल अपने कथन में एक टेबल बुला रहे हैं।

[select_type] => SIMPLE 

हम एक साधारण चयन कर रहे हैं।

[table] => secondary_images 

प्रश्न में तालिका का नाम।

[type] => ref 

चुनिंदा प्रकार, जुड़ने के लिए सबसे महत्वपूर्ण है।

[possible_keys] => primaryId 

यह एक महत्वपूर्ण क्षेत्र है: यह पता चलता है जो कुंजी संभवतः तेजी से क्रियान्वित करने में सहायता करने के लिए क्वेरी के लिए इस्तेमाल किया जा सकता है। इस मामले में, केवल आपकी प्राथमिक कुंजी उपयोगी समझा जाता है।

[key] => primaryId 

यह एक महत्वपूर्ण क्षेत्र है: यह पता चलता है जो कुंजी (रों) अंत में इस्तेमाल किया गया। इस मामले में, प्राथमिक कुंजी।

[key_len] => 5 
[ref] => const 
[rows] => 1 

क्वेरी द्वारा जांच की गई पंक्तियों की संख्या का अनुमान लगाते हुए।

[Extra] => Using where; Using filesort 

सबसे महत्वपूर्ण क्षेत्र imho। - कहां उपयोग करना: आप कहां-कथन का उपयोग कर रहे हैं। शांत ठीक। - फाइलों का उपयोग करना: आपकी क्वेरी का परिणाम इतना बड़ा है, यह स्मृति में क्रमबद्ध नहीं हो सकता है। MySQL को इसे फ़ाइल में लिखना है, फ़ाइल को सॉर्ट करना है, और आउटपुट आउटपुट करना है। इसका मतलब है डिस्क का उपयोग और सबकुछ धीमा कर देगा। सॉर्टिंग की सहायता करने वाली एक इंडेक्स जोड़ना अक्सर मदद करता है, लेकिन "फाइलोर्ट्स का उपयोग करके" को हल करना एक अध्याय है।

+0

वाह, वाह वाह। उसके लिए बहुत अधिक धन्यवाद। समझने के लिए बहुत आसान है। तो मैं इस जानकारी का उपयोग यह तय करने के लिए कैसे कर सकता हूं कि एकाधिक इंडेक्स कुंजी जाने का तरीका है या नहीं? मैं आपको फाइलोर्ट मुद्दे में शामिल होने के लिए नहीं कहूंगा क्योंकि आपने स्वयं कहा है कि यह एक और समस्या है, लेकिन इसके साथ एक से अधिक इंडेक्स कुंजी मदद पर स्विच कर रहा है? – stefmikhail

+2

आपको ** पहले ** समझाए जाने के बारे में पढ़ना चाहिए। MySQL साइट शुरू करने के लिए एक शानदार जगह है, और 'हाई परफॉर्मेंस माईएसक्यूएल' मैंने कभी पढ़ा है सबसे अच्छी MySQL पुस्तक है। फिर, समझें कि यह आपकी तालिका, स्टोरेज इंजन, आपकी कॉन्फ़िगरेशन (कैश आकार और इतने), और तालिका में डेटा पर निर्भर करता है। तो, परीक्षण करने का सबसे अच्छा तरीका: तालिका की प्रतिलिपि बनाएँ, और प्रतिलिपि पर वांछित अनुक्रमणिका जोड़ें। फिर, व्याख्याओं की तुलना करें। यही कारण है कि आपको समझाने की आवश्यकता है :) – Konerak

+0

फिर से धन्यवाद। बहुत सराहना की। मैं उस पुस्तक को उठाऊंगा। – stefmikhail

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