2012-04-15 15 views
7

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

SELECT comments.* 
    FROM comments 
    WHERE comments.imageid=46 

और ये मेरे तालिका है:

CREATE TABLE IF NOT EXISTS `comments` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `imageid` int(10) unsigned NOT NULL DEFAULT '0', 
    `uid` bigint(20) unsigned NOT NULL DEFAULT '0', 
    `content` text CHARACTER SET utf8, 
    `adate` datetime DEFAULT NULL, 
    `ip` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `ids` (`imageid`) USING BTREE, 
    KEY `dt` (`adate`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ; 

लेकिन MySQL इस सरल प्रश्न पर सूचकांक उपयोग नहीं कर सकते । यहां व्याख्या परिणाम है:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE comments ALL  ids  NULL NULL NULL 4 75.00 Using where 

जबकि मैं इस क्वेरी को बदलता हूं, माइस्क्ल इंडेक्स का उपयोग कर सकता है। क्यूं कर? :

SELECT comments.id 
    FROM comments 
    WHERE comments.imageid=46 
यहाँ

समझाने है:

id select_type  table type possible_keys key  key_len  ref  rows filtered Extra 
1 SIMPLE comments ref  ids  ids  4 const 4 100.00 Using index 
+0

से मेल नहीं खाता है तो यह तेज़ होगा * यह नहीं है "लेकिन MySQL ** ** इंडेक्स का उपयोग नहीं कर सकता" *। यह है: "लेकिन MySQL ** ** सूचकांक का उपयोग नहीं करेगा"। 'Possible_keys = ids' और' key = NULL' सुझाव देते हैं कि इंडेक्स का उपयोग करके ऑप्टिमाइज़र द्वारा जांच की गई, और अस्वीकार कर दिया गया। पूर्ण टेबल स्कैन को तेज़ माना जाता था - और यह शायद आपके मामले में है। –

उत्तर

6

मुझे लगता है कि आप 'टिप्पणी' तालिका में कुछ पंक्तियाँ है कि कोशिश की, इस कारण है कि MySQL के एक पूर्ण कर रहा है अपनी पहली क्वेरी में इंडेक्स का उपयोग करने के बजाय टेबल स्कैन करें। यह अनुमान लगा रहा है कि पूर्ण तालिका स्कैन की लागत सूचकांक के पहले मैच से कम हो सकती है और फिर पंक्तियों को देख सकती है।

आपकी दूसरी क्वेरी में इंडेक्स का उपयोग कर रहा है क्योंकि इंडेक्स से मेल खाने के बाद तालिका पंक्तियों को देखने की आवश्यकता के बिना सीधे क्वेरी के सभी कॉलम (आईडी 'कॉलम) प्राप्त करना संभव है। यह अतिरिक्त जानकारी "इंडेक्स का उपयोग" का अर्थ है।

कोशिश करें कि 'टिप्पणियों' में पंक्तियों की एक बड़ी संख्या के साथ MySQL अभी भी एक पूर्ण स्कैन का उपयोग करता है, मुझे लगता है कि यह एक अजीब व्यवहार होगा। असल में, मैंने एक MySQL संस्करण 5.1 में बिल्कुल वही परीक्षण किया है और यह हमेशा कुछ पंक्तियों के साथ 'अनुक्रमणिका' का उपयोग कर रहा है।

+0

धन्यवाद आदमी, आप सही हैं! ;) – MscEliot

1

दूसरी क्वेरी एक अनुक्रमणिका-कवर क्वेरी है। अनुरोध की गई पूरी जानकारी इंडेक्स से पढ़ी जा सकती है (चूंकि प्राथमिक कुंजी इनो डीबी में किसी भी माध्यमिक इंडेक्स का हिस्सा है)।

पहली क्वेरी में MySQL को सूचकांक से पीके को पढ़ना है, फिर पंक्तियों को पढ़ने के लिए। चूंकि तालिका में पंक्तियों की इतनी छोटी मात्रा है, ऑप्टिमाइज़र का फैसला होता है कि यदि यह सीधे पंक्तियों को पढ़ता है और

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