हमारी टीम ने पिछले हफ्ते डीबगिंग और कई MySQL लॉक टाइमआउट्स और कई अत्यंत लंबे समय तक चलने वाले प्रश्नों के स्रोत को खोजने का प्रयास किया। अंत में ऐसा प्रतीत होता है कि यह प्रश्न अपराधी है।यह क्वेरी लॉक प्रतीक्षा टाइमआउट क्यों करती है?
mysql> explain
SELECT categories.name AS cat_name,
COUNT(distinct items.id) AS category_count
FROM `items`
INNER JOIN `categories` ON `categories`.`id` = `items`.`category_id`
WHERE `items`.`state` IN ('listed', 'reserved')
AND (items.category_id IS NOT NULL)
GROUP BY categories.name
ORDER BY category_count DESC
LIMIT 10\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: items
type: range
possible_keys: index_items_on_category_id,index_items_on_state
key: index_items_on_category_id
key_len: 5
ref: NULL
rows: 119371
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: categories
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: production_db.items.category_id
rows: 1
Extra:
2 rows in set (0.00 sec)
मैं देख सकता हूं कि यह एक बुरा टेबल स्कैन कर रहा है और चलाने के लिए एक अस्थायी तालिका बना रहा है।
यह प्रश्न दस दिनों के कारक और कुछ प्रश्नों के कारण डेटाबेस प्रतिक्रिया प्रतिक्रिया का कारण क्यों बनता है जो आम तौर पर 40,000 एमएस और उच्चतर समय में विस्फोट करने के लिए 40-50ms (आइटम टेबल पर अपडेट) लेते हैं?
क्या आपने * बिना * 'विशिष्ट 'प्रोफाइलिंग करने का प्रयास किया था? ऐसा करने में काफी काम होता है और आपके पास फ़िल्टर करने के लिए बहुत कम पंक्तियां हैं :) – PhD
बहुत अच्छा। नहीं, ऐसा नहीं किया। यह निश्चित रूप से इसे अनुकूलित करने में मदद करता है। अभी भी इस बात पर स्पष्ट नहीं है कि इस तरह की धीमी क्वेरी क्यों हमारे लिए इतनी सारी समस्याएं पैदा कर सकती है। – chrishomer
बस सोच रहा है कि आपको इसकी आवश्यकता क्यों है और (आइटम.category_id पूर्ण नहीं है) '- क्योंकि यह एक' इनर जॉइन 'है - श्रेणी.आईडी को 'NULL' –