का उपयोग न करने वाले क्वेरी चर के साथ चयन करें मैं स्थानीय चर के उपयोग से एक पुनरावर्ती क्वेरी के साथ एक साधारण आसन्नता सूची में नोड्स के पेड़ को पुनर्प्राप्त करने के साथ (रुचि से बाहर) खेल रहा था।इंडेक्स
मेरे पास अब तक का समाधान मजेदार है लेकिन मुझे आश्चर्य है (और यह मेरा एकमात्र सवाल है) क्यों MySQL इस क्वेरी को अनुकूलित करने के लिए INDEX
का उपयोग करने से इंकार कर देता है। क्या MySQL INDEX
का उपयोग कर निकटतम बच्चे को देखने में सक्षम नहीं होना चाहिए?
मुझे उत्सुकता है कि MySQL क्यों नहीं करता है। यहां तक कि जब मैं FORCE INDEX
का उपयोग करता हूं तो निष्पादन योजना नहीं बदली जाती है। ,
SELECT
@last_id := id AS id,
parent_id,
name,
@depth := IF(parent_id = 5, 1, @depth + 1) AS depth
FROM
tree FORCE INDEX (index_parent_id, PRIMARY, index_both),
(SELECT @last_id := 5, @depth := -1) vars
WHERE id = 5 OR parent_id = @last_id OR parent_id = 5
ध्यान दें कि कारण छोटे डाटासेट नहीं किया जा सकता है क्योंकि:
यह अब तक, क्वेरी है 5
माता पिता नोड के आईडी होने के साथ जब मैं FORCE INDEX (id)
या FORCE INDEX (parent_id)
या FORCE INDEX (id, parent_id)
निर्दिष्ट करता हूं तो व्यवहार नहीं बदलेगा ...
डॉक्स कहते हैं:
तुम भी बल सूचकांक है, जो उपयोग सूचकांक (index_list) की तरह काम करता उपयोग कर सकते हैं लेकिन इसके अलावा कि एक मेज स्कैन बहुत महंगा माना जाता है के साथ। दूसरे शब्दों में, तालिका स्कैन का उपयोग केवल तभी किया जाता है जब तालिका में पंक्तियों को खोजने के लिए दिए गए इंडेक्स में से किसी एक का उपयोग करने का कोई तरीका न हो।
ऐसा कुछ होना चाहिए जो इंडेक्स का उपयोग करने में असमर्थ क्वेरी को प्रस्तुत करता हो, लेकिन मुझे समझ में नहीं आता कि यह क्या है।
अस्वीकरण: मैं जानता हूँ कि वहाँ की दुकान और SQL में श्रेणीबद्ध डेटा पुनः प्राप्त करने के लिए विभिन्न तरीके हैं। मैं नेस्टेड सेट मॉडल के बारे में जानता हूं। मैं एक वैकल्पिक कार्यान्वयन की तलाश नहीं कर रहा हूं। मैं नेस्टेड सेट की तलाश नहीं कर रहा हूं।
मुझे यह भी पता अपने आप में क्वेरी पागल है और गलत परिणाम पैदा करता है।
मैं बस समझना चाहता हूं (विस्तार से) क्यों MySQL इस मामले में INDEX
का उपयोग नहीं कर रहा है।
कभी-कभी किसी तालिका में इतने कम रिकॉर्ड होते हैं कि यह पूरी तालिका को पढ़ने के बजाय इंडेक्स का उपयोग करने के लिए अधिक ओवरहेड होता है। – Randy
@randy अब एक व्यावहारिक तर्क है ... – xandercoded
@Randy अद्यतन प्रश्न देखें – Kaii