5

मैं के बाद से मैं दृश्यता, NUM_SUBSCRIBERS और NUM_ITEMS पर एक सूचकांक है इसmysql बहु कॉलम अनुक्रमणिका काम नहीं कर रहा है (अपेक्षित के रूप में)?

CREATE TABLE IF NOT EXISTS `tbl_folder` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `owner_userid` int(11) NOT NULL, 
    `name` varchar(63) NOT NULL, 
    `description` text NOT NULL, 
    `visibility` tinyint(4) NOT NULL DEFAULT '2', 
    `num_items` int(11) NOT NULL DEFAULT '0', 
    `num_subscribers` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `owner_userid` (`owner_userid`), 
    KEY `vis_sub_item` (`visibility`,`num_subscribers`,`num_items`) 
) ENGINE=InnoDB 

की तरह एक मेज है, मैं उम्मीद करते हैं कि केवल पहले 15 पंक्तियों केवल, को देखा जाना है बजाय, व्याख्या 55,856 पंक्तियों कहते हैं। कोई उपाय? धन्यवाद

EXPLAIN SELECT t.id, name, description, owner_userid, num_items, num_subscribers 
FROM `tbl_folder` `t` 
WHERE visibility =2 
ORDER BY `t`.`num_subscribers` DESC , `t`.`num_items` DESC 
LIMIT 15 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE t ref vis_sub_item vis_sub_item 1 const 55856 Using where 
+0

"एसक्यूएल ब्लॉक" टैग में अपना एसक्यूएल लपेटें ताकि हम इसे आसानी से पढ़ सकें। यह इसे खड़ा करने में मदद करता है और इसे पढ़ने में आसान बनाता है। – Webnet

उत्तर

2

आपका 3 क्षेत्र सूचकांक अच्छा लग रहा है की कोशिश करो और EXPLAIN होनहार है।

हालांकि यह "55856 पंक्तियां" कहता है, यह अनुमानEXPLAIN द्वारा प्रदान किया गया है।

key_len =1 के बाद से, आप जानते हैं कि यह आपके यौगिक अनुक्रमणिका के पहले बाइट को समानता/संदर्भ के रूप में उपयोग कर रहा है।

चूंकि कोई filesort अपने Extra क्षेत्र में उल्लेख किया है, आप जानते हैं कि ORDER BY/छँटाई है सूचकांक द्वारा नियंत्रित किया जा रहा है।

यदि आप अपने handler_% सत्र आंकड़े जांचते हैं, तो आपको एक बेहतर विचार होगा कि वास्तव में कितनी पंक्तियां पढ़ी जा रही हैं।

साइड विचार:

के बाद से आप जानते हैं कि आप अंततः, अपनी पंक्तियों को पुनः प्राप्त करने यदि आपके डेटा के 99% visibility=2 (सिर्फ अटकलें) है डिस्क हिट करने के लिए जा रहे हैं, आप की संभावना के रूप में समान रूप से अच्छे मिल चाहते हैं/num_subscribers & num_items पर एक कंपाउंड इंडेक्स के साथ तेज़ परिणाम। या अगर आपके पास कार्डिनलिटी/विशिष्टता के आधार पर num_subscribers पर एक ही इंडेक्स है तो अच्छी तरह से/तेज के रूप में तर्कसंगत।

0

मुझे नहीं लगता कि EXPLAINOFFSET या LIMIT खंड पर लग रहा है है। EXPLAIN यह इंगित करना है कि क्वेरी को कैसे निष्पादित किया जाएगा, किस कुंजी का उपयोग किया जाता है, टेबल कैसे शामिल होते हैं, आदि। LIMIT खंड एक पोस्ट क्वेरी संशोधक की तरह है ... अब हम जानते हैं कि हम क्या चाहते हैं, केवल मुझे दें पहले बहुत सारे। इसलिए, पंक्तियों के क्षेत्र में क्वेरी में मौजूद संभावित पंक्तियों की संख्या शामिल है। वहां से, OFFSET और LIMIT आपके इच्छित विशिष्टताओं का चयन करेंगे।

मुझे लगता है कि अगर आपने के बिना SELECT निष्पादित किया है, तो आपको रिकॉर्ड्स की संख्या मिल जाएगी।

0

हाँ, समस्या यह है कि आपकी अनुक्रमणिका सही नहीं है। मेरा मतलब है कि आपने सभी 3 फ़ील्ड अनुक्रमित किए हैं और आपकी चयन क्वेरी केवल एक के लिए जांचती है। MySQL अनुक्रमण 2 पंक्तियों में अलग-अलग 3 पंक्तियों को अनुक्रमणित करने से अलग है।

CREATE TABLE IF NOT EXISTS `tbl_folder` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `owner_userid` int(11) NOT NULL, 
    `name` varchar(63) NOT NULL, 
    `description` text NOT NULL, 
    `visibility` tinyint(4) NOT NULL DEFAULT '2', 
    `num_items` int(11) NOT NULL DEFAULT '0', 
    `num_subscribers` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `owner_userid` (`owner_userid`), 
    KEY `vis_index` (`visibility`), 
    KEY `vis_sub_item` (`num_subscribers`,`num_items`) 
) ENGINE=InnoDB 
+0

y इस पोस्ट को डाउनवॉटेड किया गया है? –

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