2012-06-12 13 views
7

पर विचार के बाद दो बताते हैं:कोई सूचकांक नहीं! =?

EXPLAIN SELECT * FROM sales WHERE title != 'The' 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ALL  title  NULL NULL NULL 41707 Using where 

और -

EXPLAIN SELECT * FROM sales WHERE title = 'The' 
id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  sales ref  title   title 767 const 1 Using where 

क्यों != क्वेरी एक NULL कुंजी है? यह title का उपयोग क्यों नहीं करता है? एक सूचकांक का उपयोग करने में सक्षम होने के लिए = कथन का कारण क्या है लेकिन != नहीं?

उत्तर

11

सूचकांक का उपयोग करने पर कोई बात नहीं है जब तक कि title बिल्कुल 'The' है।

चूंकि लगभग हर पंक्ति को चुनने की आवश्यकता है, इसलिए आपको इंडेक्स का उपयोग करने से कुछ भी प्राप्त नहीं होता है। यह वास्तव में एक इंडेक्स का उपयोग करने के लिए महंगा हो सकता है, जो शायद आपका MySQL इंजन निर्धारित कर रहा है, इसलिए यह इंडेक्स का उपयोग न करने का विकल्प चुन रहा है।)

1 स्मृति में पूरे सूचकांक पेड़ पढ़ें:

सूचकांक का उपयोग करना:

काम की राशि इन दोनों स्थितियों में किया की तुलना करें।
2) मूल्य 'द' के लिए इंडेक्स पेड़ खोजें और उन प्रविष्टियों को फ़िल्टर करें।
3) कुछ अपवादों को छोड़कर प्रत्येक पंक्ति को पढ़ें (जो डिस्क पर उसी ब्लॉक में हैं जो पंक्तियों के रूप में पढ़ने की आवश्यकता है, इसलिए वास्तव में तालिका में स्मृति से पूरी तालिका को पढ़ने की संभावना है)।

सूचकांक बिना

:

1) स्मृति में प्रत्येक पंक्ति पढ़ें और किसी भी जहां title = 'The' परिणाम से सेट

+1

पर कि विस्तार करने के लिए पढ़ने के दौरान उन्हें को फ़िल्टर - चयन प्रत्येक पंक्ति जहां शीर्षक "द" तालिका में लगभग हर पंक्ति को वापस नहीं करेगा, इसलिए इस क्वेरी के लिए इंडेक्स का उपयोग करने में कोई बात नहीं है। (चूंकि आपको उन सभी पंक्तियों को वापस करने के लिए पूरी तालिका को स्कैन करना होगा।) – duskwuff

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