मैं अभी भी MySQL के बारे में सीख रहा हूं। मैं एक बहुत ही बुनियादी त्रुटि कर रहा हूं, और मैं यहां दबाए जाने के लिए तैयार हूं ...मेरी mysql क्वेरी को धीमा कर एक गिनती() गणना कर रहा है?
यह क्वेरी क्या करने का प्रयास कर रही है, पुस्तक की संख्या की गणना के आधार पर हमारी वेबसाइट के शीर्ष सदस्यों का चयन करें और नुस्खा समीक्षा उन्होंने बनाई है।
मैं SQL क्वेरी में कुल की गणना कर रहा हूं। क्वेरी धीमी है (9 सेकंड) और निश्चित रूप से स्केल नहीं करेगा क्योंकि हमारे पास केवल 400 सदस्य हैं और कुछ हज़ार समीक्षाएं हैं और यह काफी तेजी से बढ़ रही है।
मुझे लगता है कि यह एक पूर्ण टेबल स्कैन कर रहा है, और यह गणना इसे धीमा कर रही है, लेकिन मुझे ऐसा करने का एक वैकल्पिक तरीका पता नहीं है और कुछ ज्ञान पसंद आएगा।
यहाँ SQL विवरण है:
+----+-------------+----------------+-------+-------------------+-------------------+---------+---------------------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+-------+-------------------+-------------------+---------+---------------------+------+---------------------------------+
| 1 | SIMPLE | users | index | NULL | PRIMARY | 4 | NULL | 414 | Using temporary; Using filesort |
| 1 | SIMPLE | recipe_reviews | ref | recipe_reviews_fk | recipe_reviews_fk | 5 | users.ID | 12 | |
| 1 | SIMPLE | book_reviews | ref | user_id | user_id | 5 | users.ID | 4 | |
| 1 | SIMPLE | bookshelf | ref | recipe_reviews_fk | recipe_reviews_fk | 5 | users.ID | 13 | |
+----+-------------+----------------+-------+-------------------+-------------------+---------+---------------------+------+---------------------------------+
अद्यतन & हल:
SELECT users.*, COUNT(DISTINCT bookshelf.ID) AS titles, COUNT(DISTINCT book_reviews.ID) as bookreviews, COUNT(DISTINCT recipe_reviews.ID) AS numreviews, COUNT(DISTINCT book_reviews.ID) + COUNT(DISTINCT recipe_reviews.ID) as reviewtotal
FROM users
LEFT OUTER JOIN recipe_reviews ON recipe_reviews.user_id = users.ID
LEFT OUTER JOIN book_reviews ON book_reviews.user_id = users.ID
LEFT OUTER JOIN bookshelf ON users.ID = bookshelf.user_id
GROUP BY users.ID
ORDER BY reviewtotal DESC
LIMIT 8
यहाँ विवरण है
मैंने महसूस किया, और इस बात की पुष्टि @recursive, तो वह पूछताछ है समस्या की जड़। मुझे इस से कार्टेशियन उत्पाद मिल रहा है। मैं सबक्वेरी की एक श्रृंखला के रूप में यह दुबारा लिखा और अंतिम काम कर कोड यहाँ है:
SELECT *, bookreviews + recipereviews AS totalreviews
FROM (SELECT users.*,
(SELECT count(*) FROM bookshelf WHERE bookshelf.user_id = users.ID) as titles,
(SELECT count(*) FROM book_reviews WHERE book_reviews.user_id = users.ID) as bookreviews,
(SELECT count(*) FROM recipe_reviews WHERE recipe_reviews.user_id = users.ID) as recipereviews
FROM users) q
यह मैं मिलीसेकेंड में एक परिणाम देता है। जॉइन के साथ ऐसा करने के तरीके भी हैं। यदि आप इसका पालन करना चाहते हैं तो How to add together the results of several subqueries? देखें।
मैंने रिकर्सिव के उत्तर को सही के रूप में चिह्नित किया है, हालांकि उनका प्रारंभिक उत्तर समाधान नहीं है, उन्होंने इसे निम्नलिखित टिप्पणियों में खींचा। – mandel