2 प्रश्नों कि मुझे लगता है कि एक ही समारोह कर उपयोग कर सकते हैं बनाया है शामिल होता है। वे दोनों गुण होते हैं जिन्हें मैं एक ही क्वेरी में विलय करना चाहता हूं लेकिन मैं असमर्थ हूं।MySQL सूचकांक अनुकूलन
QUERY 1 - मुझे वही परिणाम देता है जो मैं चाहता हूं। धीरे (~ 0.700 सेकंड)
क्वेरी के 2 - मुझे पंक्तियों है कि मैं ध्यान न दें और छोड़ की एक बहुत कुछ देता है। फास्ट (~ 0.005 सेकंड)
मेरा लक्ष्य प्रत्येक आइटम के लिए 1 को छोड़कर सभी शून्य मूल्य पंक्तियों को छोड़ने के लिए QUERY 2 को संशोधित करना है। मैं प्रदर्शन पर एक डिंग लेने के साथ ऐसा नहीं कर सकता। यह MySQL में इंडेक्स उपयोग के अनुभव और समझ की कमी के कारण है।
क्वेरी के 1
एक खराब तरीके से तैयार सबक्वेरी जो भर में tbl_sale (ई) अनुक्रमण के उपयोग की अनुमति नहीं है जो 10k पंक्तियां हैं उपयोग करता है।
SELECT b.id, b.sv, b.description, der.store_id, f.name, der.price
FROM tbl_watch AS a
LEFT JOIN tbl_item AS b ON a.item_id = b.id
LEFT JOIN (
SELECT c.store_id, d.flyer_id, e.item_id, e.price
FROM tbl_storewatch AS c, tbl_storeflyer AS d
FORCE INDEX (storebeg_ndx) , tbl_sale AS e
WHERE c.user_id = '$user_id'
AND (
d.store_id = c.store_id
AND d.date_beg = '20121206'
)
AND e.flyer_id = d.flyer_id
) AS der ON a.item_id = der.item_id
LEFT JOIN tbl_store as f ON der.store_id = f.id
WHERE a.user_id = '$user_id'
ORDER BY b.description ASC
क्वेरी यहां 1
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY a ref user_item_ndx user_item_ndx 4 const 30 Using index; Using temporary; Using filesort
1 PRIMARY b eq_ref PRIMARY PRIMARY 4 a.item_id 1
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 300
1 PRIMARY f eq_ref PRIMARY PRIMARY 4 der.store_id 1
2 DERIVED c ref user_ndx user_ndx 4 6
2 DERIVED e ALL NULL NULL NULL NULL 9473 Using join buffer
2 DERIVED d eq_ref storebeg_ndx storebeg_ndx 8 c.store_id 1 Using where
क्वेरी के 2
के लिए व्याख्या है (आदेश द्वारा को छोड़कर) का उपयोग करता है सब छोड़ दिया मिलती है जो बहुत ही कुशल है। प्रत्येक शामिल होने पर इंडेक्स का उपयोग किया जाता है। यह क्वेरी tbl_watch में प्रत्येक आइटम के लिए सभी संभावित मिलान देता है।
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ref user_item_ndx user_item_ndx 4 const 6 Using index; Using temporary; Using filesort
1 SIMPLE b eq_ref PRIMARY PRIMARY 4 a.item_id 1
1 SIMPLE c ref user_ndx user_ndx 4 const 2
1 SIMPLE d eq_ref storebeg_ndx,storendx storebeg_ndx 8 c.store_id,const 1
1 SIMPLE e eq_ref itemflyer_ndx itemflyer_ndx 8 a.item_id,d.flyer_id 1
1 SIMPLE f eq_ref PRIMARY PRIMARY 4 d.store_id 1
मैंने QUERY 2 (अधिक कुशल) मेरे बस पंक्तियों मैंने QUERY 1 में करने के लिए की तरह की जरूरत है देने के लिए संशोधित कर सकते हैं कैसे:
SELECT b.id, b.sv, b.description, c.store_id, f.name, e.price
FROM tbl_watch AS a
LEFT JOIN tbl_item AS b ON a.item_id = b.id
LEFT JOIN tbl_storewatch AS c ON c.user_id = '$user_id'
LEFT JOIN tbl_storeflyer AS d ON d.store_id = c.store_id
AND d.date_beg = '$s_date'
LEFT JOIN tbl_sale AS e ON e.item_id = a.item_id
AND e.flyer_id = d.flyer_id
LEFT JOIN tbl_store as f ON d.store_id = f.id
WHERE a.user_id = '$user_id'
ORDER BY b.description ASC
क्वेरी के लिए व्याख्या है: क्वेरी है के साथ काम?
धन्यवाद माइक
मुझे सच में यकीन नहीं है कि यह कैसे संभव है कि पहली क्वेरी आपको वह चाहिए जो आप चाहते हैं। एक बाएं जॉइन बाएं बाहरी जुड़ाव नहीं है (हालांकि शायद यह MySQL में है, यह गैर-एसक्यूएल अनुपालन है), और नल अद्वितीय मान नहीं हैं। मेरे पास MySQL आसान नहीं है, लेकिन PostgreSQL में इसे छोड़ना आपके द्वारा वर्णित परिणामों को नहीं देता है। मेरा जवाब नीचे ... – PlexQ