2015-10-08 6 views
6

MySQL मैनुअल में index hinting पर एक पृष्ठ है जो उल्लेख करता है कि आप क्वेरी के विशिष्ट भागों के लिए इंडेक्स संकेत निर्दिष्ट कर सकते हैं।माइस्क्ल में इंडेक्स स्कोप कैसे काम करता है?

आप संकेत के लिए FOR खंड जोड़ कर इंडेक्स संकेत का दायरा निर्दिष्ट कर सकते हैं। यह क्वेरी प्रसंस्करण के विभिन्न चरणों के लिए निष्पादन योजना के अनुकूलक के चयन पर अधिक सुदृढ़ नियंत्रण प्रदान करता है। केवल इंडेक्स को प्रभावित करने के लिए जब MySQL निर्णय लेता है कि तालिका में पंक्तियों को कैसे ढूंढें और कैसे जुड़ें संसाधित करें, FOR JOIN का उपयोग करें। पंक्तियों को सॉर्ट करने या समूहित करने के लिए इंडेक्स उपयोग को प्रभावित करने के लिए, FOR ORDER BY या FOR GROUP BY का उपयोग करें।

हालांकि, यह कैसे काम करता है या यह वास्तव में MySQL अनुकूलक में क्या करता है इसके बारे में कोई और जानकारी नहीं है। साथ ही अभ्यास में यह वास्तव में कुछ भी सुधारने में नगण्य प्रतीत होता है।

यहाँ एक परीक्षण क्वेरी है और क्या समझाना क्वेरी के बारे में कहते हैं:

SELECT 
    `property`.`primary_id` AS `id` 
FROM `California` `property` 

USE INDEX FOR JOIN (`Zipcode Bedrooms`) 
USE INDEX FOR ORDER BY (`Zipcode Bathrooms`) 

INNER JOIN `application_zipcodes` `az` 
    ON `az`.`application_id` = '18' 
    AND `az`.`zipcode` = `property`.`zipcode` 

WHERE `property`.`city` = 'San Jose' 
AND `property.`zipcode` = '95133' 
AND `property`.property_type` = 'Residential' 
AND `property`.`style` = 'Condominium' 
AND `property`.`bedrooms` = '3' 
ORDER BY `property`.`bathrooms` ASC 
LIMIT 15 
; 

के बारे में बताएं:

EXPLAIN SELECT `property`.`primary_id` AS `id` FROM `California` `property` USE INDEX FOR JOIN (`Zipcode Bedrooms`) USE INDEX FOR ORDER BY (`Zipcode Bathrooms`) INNER JOIN `application_zipcodes` `az` ON `az`.`application_id` = '18' AND `az`.`zipcode` = `property`.`zipcode` WHERE `property`.`city` = 'San Jose' AND `property.`zipcode` = '95133' AND `property`.property_type` = 'Residential' AND `property`.`style` = 'Condominium' AND `property`.`bedrooms` = '3' ORDER BY `property`.`bathrooms` ASC LIMIT 15\g 
+------+-------------+----------+--------+---------------+---------+---------+------------------------------------+------+----------------------------------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref        | rows | Extra            | 
+------+-------------+----------+--------+---------------+---------+---------+------------------------------------+------+----------------------------------------------------+ 
| 1 | SIMPLE  | Property | ref | Zip Bed  | Zip Bed | 17  | const,const      | 2364 | Using index condition; Using where; Using filesort | 
| 1 | SIMPLE  | az  | eq_ref | PRIMARY  | PRIMARY | 7  | const,Property.zipcode    | 1 | Using where; Using index       | 
+------+-------------+----------+--------+---------------+---------+---------+------------------------------------+------+----------------------------------------------------+ 
2 rows in set (0.01 sec) 

तो मैं मूल रूप से सोच रहा हूँ कैसे सूचकांक दायरे में इस्तेमाल किया जाना चाहिए था संक्षेप में प्रस्तुत करने, क्योंकि जब मैं USE INDEX FOR ORDER BY (Zipcode Bathrooms) लाइन जोड़ता या हटाता हूं तो ऐसा कुछ नहीं लगता है।

उत्तर

1

मैं यह पता लगाने की कैसे कई संकेत इस्तेमाल किया जा सकता है अभी तक की है। MySQL लगभग SELECT प्रति एक से अधिक इंडेक्स का उपयोग नहीं करेगा। मुझे पता है कि एकमात्र अपवाद "इंडेक्स विलय" के साथ है, जो आपके उदाहरण में प्रासंगिक नहीं है।

अनुकूलक आमतौर पर WHERE खंड के लिए एक अच्छी अनुक्रमणिका खोजने पर केंद्रित है। यदि यह पूरी तरह से WHERE को बिना किसी "श्रेणी" के कवर करता है, तो यह देखने के लिए जांच करता है कि GROUP BY और ORDER BY फ़ील्ड्स सही क्रम में उपयोग करने के लिए हैं या नहीं। यदि यह WHERE, GROUP BY, and ORDER BY के सभी को संभाल सकता है, तो यह वास्तव में LIMIT (लेकिन OFFSET नहीं) को अनुकूलित कर सकता है।

यदि ऑप्टिमाइज़र सभी WHERE का उपभोग नहीं कर सकता है, तो यह ORDER BY में "फाइलोर्ट" से बचने की उम्मीद में ORDER BY अन्यथा आवश्यक हो सकता है। इस के

कोई भी अलग खंड के लिए अलग अनुक्रमित के लिए अनुमति देता है। एक संकेत एक उपरोक्त मामलों में से एक (उपरोक्त) के उपयोग को प्राथमिकता में प्रोत्साहित कर सकता है; मुझे नहीं पता।

ज़िप कोड के लिए utf8 का उपयोग न करें; यह चीजों को आवश्यकतानुसार थोक बनाता है (प्रति चरित्र 3 बाइट)। आम तौर पर, तालिका के आकार को कम करने से कुछ प्रदर्शन में मदद मिलेगी। या, यदि आपके पास एक विशाल डेटासेट है, तो यह बहुत अधिक मदद कर सकता है। (I/O से बचना बहुत महत्वपूर्ण है।)

Bathrooms बहुत चुनिंदा नहीं है; अगर यह संभव होगा तो भी हासिल करने के लिए बहुत कुछ नहीं है।

az.application_id क्वेरी में बड़ा बंदर रिंच है; यह क्या है?

+0

अनिवार्य रूप से यह मेरे पास ज़िपकोड की सूची के बीच कई रिश्तों को बनाने का एक तरीका था। [आपने वास्तव में उस मुद्दे पर टिप्पणी की जो मैं कर रहा था और यह परिणाम सबसे तेज़ परिणाम प्रतीत होता है।] (Http: // stackoverflow।कॉम/प्रश्न/32256402/एसक्यूएल-प्रदर्शन-उपयोग-या-धीमा-से-इन-जब-उपयोग-ऑर्डर-द्वारा-इन) प्रश्न में यह प्रश्न वास्तव में तेज़ है यदि यह सही इंडेक्स का उपयोग कर रहा है, हालांकि अनुकूलक गलत फाइल चुनने का प्रयास करता है, जिससे फाइलॉर्ट होता है। साथ ही मैं इंडेक्स को भी हटा नहीं सकता क्योंकि वे दोनों उद्देश्यों को हल करने के लिए आवश्यक हैं। – Dbeazy

+0

फिर से मेरी आखिरी टिप्पणी को संपादित करने में सक्षम नहीं था। आपने कहा, 'बाथरूम बहुत चुनिंदा नहीं है; अगर यह संभव होगा तो भी हासिल करने के लिए बहुत कुछ नहीं है। 'हालांकि यह कहां बयान के मामले में सच है, यह बहुत सारी पंक्तियां है, इसलिए इसे आदेश के लिए एक सूचकांक के रूप में उपयोग करना बहुत तेज़ होगा 'बेडरूम 'पर एक इंडेक्स का उपयोग करना। यह भी ध्यान रखना चाहता था कि मैंने ज़ीपोड्स के लिए एक विशाल यूनियन ऑल का उपयोग करने का भी प्रयास किया था, और यह वास्तव में तेज़ था, लेकिन इसे मेरे अलावा अन्य डेवलपर्स द्वारा प्रबंधित करने की आवश्यकता थी, इसलिए मुझे लगता था कि वर्तमान की तुलना में मामूली गति वृद्धि के लिए घुलनशील अमूर्तता थी इसके लायक नहीं। – Dbeazy

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