2012-11-15 12 views
9

निम्न क्वेरी 1.6 सेकंडयह WHERE क्लॉज मेरी क्वेरी 180 गुना धीमा क्यों करता है?

SET @num :=0, @current_shop_id := NULL, @current_product_id := NULL; 

#this query limits the results of the query within it by row number (so that only 250 products get displayed per store) 

SELECT * FROM (

#this query adds row numbers to the query within it 

SELECT *, @num := IF(@current_shop_id = shop_id, IF(@current_product_id=product_id,@num,@num+1), 0) AS row_number, @current_shop_id := shop_id AS shop_dummy, @current_product_id := product_id AS product_dummy FROM (

SELECT shop, shops.shop_id AS 
shop_id, p1.product_id AS 
product_id 
    FROM products p1 LEFT JOIN #this LEFT JOIN gets the favorites count for each product 
    (
    SELECT fav3.product_id AS product_id, SUM(CASE 
    WHEN fav3.current = 1 AND fav3.closeted = 1 THEN 1 
    WHEN fav3.current = 1 AND fav3.closeted = 0 THEN -1 
    ELSE 0 
    END) AS favorites_count 
    FROM favorites fav3 
GROUP BY fav3.product_id 

) AS fav4 ON p1.product_id=fav4.product_id 
    INNER JOIN sex ON sex.product_id=p1.product_id AND 
    sex.sex=0 AND 
    sex.date >= SUBDATE(NOW(),INTERVAL 1 DAY) 
    INNER JOIN shops ON shops.shop_id = p1.shop_id 
    ORDER BY shop, sex.DATE, product_id 
    ) AS testtable 

) AS rowed_results WHERE 
rowed_results.row_number>=0 AND 
rowed_results.row_number<(7) 

अंतिम कहां खंड क्वेरी 292 सेकंड में निष्पादित करने के लिए कारण बनता है AND shops.shop_id=86 जोड़ने में कार्यान्वित: AND shops.shop_id=86 साथ

SET @num :=0, @current_shop_id := NULL, @current_product_id := NULL; 

#this query limits the results of the query within it by row number (so that only 250 products get displayed per store) 

SELECT * FROM (

#this query adds row numbers to the query within it 

SELECT *, @num := IF(@current_shop_id = shop_id, IF(@current_product_id=product_id,@num,@num+1), 0) AS row_number, @current_shop_id := shop_id AS shop_dummy, @current_product_id := product_id AS product_dummy FROM (

SELECT shop, shops.shop_id AS 
shop_id, p1.product_id AS 
product_id 
    FROM products p1 LEFT JOIN #this LEFT JOIN gets the favorites count for each product 
    (
    SELECT fav3.product_id AS product_id, SUM(CASE 
    WHEN fav3.current = 1 AND fav3.closeted = 1 THEN 1 
    WHEN fav3.current = 1 AND fav3.closeted = 0 THEN -1 
    ELSE 0 
    END) AS favorites_count 
    FROM favorites fav3 
GROUP BY fav3.product_id 

) AS fav4 ON p1.product_id=fav4.product_id 
    INNER JOIN sex ON sex.product_id=p1.product_id AND 
    sex.sex=0 AND 
    sex.date >= SUBDATE(NOW(),INTERVAL 1 DAY) 
    INNER JOIN shops ON shops.shop_id = p1.shop_id AND 
    shops.shop_id=86 
    ORDER BY shop, sex.DATE, product_id 
    ) AS testtable 

) AS rowed_results WHERE 
rowed_results.row_number>=0 AND 
rowed_results.row_number<(7) 

मैं दुकानों तालिका सीमित सोचा होगा होगा निष्पादन समय को कम करें। इसके बजाए, निष्पादन समय उत्पादों की दुकानों में पंक्तियों की संख्या पर निर्भर करता है, विशेष दुकानों के समान products.shop_id के साथ .shop_id। Product.shop_id = 86 के साथ उत्पाद तालिका में लगभग 34K पंक्तियां हैं, और निष्पादन समय 2 9 2 सेकंड है। Products.shop_id = 50 के लिए, लगभग 28K पंक्तियां हैं, और निष्पादन समय 210 सेकंड है। Products.shop_id = 175 के लिए, लगभग 2K पंक्तियां हैं, और निष्पादन समय 2.8 सेकंड है। क्या हो रहा है?

1.6 दूसरी क्वेरी के लिए बढ़ाया समझाने है:

इस विस्तारित समझाने के लिए
id select_type table type possible_keys key key_len ref rows filtered Extra 
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1203 100.00 Using where 
2 DERIVED <derived3> ALL NULL NULL NULL NULL 1203 100.00 
3 DERIVED sex ALL product_id_2,product_id NULL NULL NULL 526846 75.00 Using where; Using temporary; Using filesort 
3 DERIVED p1 eq_ref PRIMARY,shop_id,shop_id_2,product_id,shop_id_3 PRIMARY 4 mydatabase.sex.product_id 1 100.00 
3 DERIVED <derived4> ALL NULL NULL NULL NULL 14752 100.00 
3 DERIVED shops eq_ref PRIMARY PRIMARY 4 mydatabase.p1.shop_id 1 100.00 
4 DERIVED fav3 ALL NULL NULL NULL NULL 15356 100.00 Using temporary; Using filesort 

शो चेतावनी

-----+ 
| Note | 1003 | select `rowed_results`.`shop` AS `shop`,`rowed_results`.`shop_id` AS `shop_id`,`rowed_results`.`product_id` AS `product_id`,`rowed_results`.`row_number` AS `row_number`,`rowed_results`.`shop_dummy` AS `shop_dummy`,`rowed_results`.`product_dummy` AS `product_dummy` from (select `testtable`.`shop` AS `shop`,`testtable`.`shop_id` AS `shop_id`,`testtable`.`product_id` AS `product_id`,(@num:=if(((@current_shop_id) = `testtable`.`shop_id`),if(((@current_product_id) = `testtable`.`product_id`),(@num),((@num) + 1)),0)) AS `row_number`,(@current_shop_id:=`testtable`.`shop_id`) AS `shop_dummy`,(@current_product_id:=`testtable`.`product_id`) AS `product_dummy` from (select `mydatabase`.`shops`.`shop` AS `shop`,`mydatabase`.`shops`.`shop_id` AS `shop_id`,`mydatabase`.`p1`.`product_id` AS `product_id` from `mydatabase`.`products` `p1` left join (select `mydatabase`.`fav3`.`product_id` AS `product_id`,sum((case when ((`mydatabase`.`fav3`.`current` = 1) and (`mydatabase`.`fav3`.`closeted` = 1)) then 1 when ((`mydatabase`.`fav3`.`current` = 1) and (`mydatabase`.`fav3`.`closeted` = 0)) then -(1) else 0 end)) AS `favorites_count` from `mydatabase`.`favorites` `fav3` group by `mydatabase`.`fav3`.`product_id`) `fav4` on(((`mydatabase`.`p1`.`product_id` = `mydatabase`.`sex`.`product_id`) and (`fav4`.`product_id` = `mydatabase`.`sex`.`product_id`))) join `mydatabase`.`sex` join `mydatabase`.`shops` where ((`mydatabase`.`sex`.`sex` = 0) and (`mydatabase`.`p1`.`product_id` = `mydatabase`.`sex`.`product_id`) and (`mydatabase`.`shops`.`shop_id` = `mydatabase`.`p1`.`shop_id`) and (`mydatabase`.`sex`.`date` >= (now() - interval 1 day))) order by `mydatabase`.`shops`.`shop`,`mydatabase`.`sex`.`date`,`mydatabase`.`p1`.`product_id`) `testtable`) `rowed_results` where ((`rowed_results`.`row_number` >= 0) and (`rowed_results`.`row_number` < 7)) | 
+------ 

292 दूसरी क्वेरी के लिए बढ़ाया समझाने जाता है:

id select_type table type possible_keys key key_len ref rows filtered Extra 
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 36 100.00 Using where 
2 DERIVED <derived3> ALL NULL NULL NULL NULL 36 100.00 
3 DERIVED shops const PRIMARY PRIMARY 4  1 100.00 Using temporary; Using filesort 
3 DERIVED p1 ref PRIMARY,shop_id,shop_id_2,product_id,shop_id_3 shop_id 4  11799 100.00 
3 DERIVED <derived4> ALL NULL NULL NULL NULL 14752 100.00 
3 DERIVED sex eq_ref product_id_2,product_id product_id_2 5 mydatabase.p1.product_id 1 100.00 Using where 
4 DERIVED fav3 ALL NULL NULL NULL NULL 15356 100.00 Using temporary; Using filesort 

इस विस्तार के लिए चेतावनी दिखाएं

है
----+ 
| Note | 1003 | select `rowed_results`.`shop` AS `shop`,`rowed_results`.`shop_id` AS `shop_id`,`rowed_results`.`product_id` AS `product_id`,`rowed_results`.`row_number` AS `row_number`,`rowed_results`.`shop_dummy` AS `shop_dummy`,`rowed_results`.`product_dummy` AS `product_dummy` from (select `testtable`.`shop` AS `shop`,`testtable`.`shop_id` AS `shop_id`,`testtable`.`product_id` AS `product_id`,(@num:=if(((@current_shop_id) = `testtable`.`shop_id`),if(((@current_product_id) = `testtable`.`product_id`),(@num),((@num) + 1)),0)) AS `row_number`,(@current_shop_id:=`testtable`.`shop_id`) AS `shop_dummy`,(@current_product_id:=`testtable`.`product_id`) AS `product_dummy` from (select 'shop.nordstrom.com' AS `shop`,'86' AS `shop_id`,`mydatabase`.`p1`.`product_id` AS `product_id` from `mydatabase`.`products` `p1` left join (select `mydatabase`.`fav3`.`product_id` AS `product_id`,sum((case when ((`mydatabase`.`fav3`.`current` = 1) and (`mydatabase`.`fav3`.`closeted` = 1)) then 1 when ((`mydatabase`.`fav3`.`current` = 1) and (`mydatabase`.`fav3`.`closeted` = 0)) then -(1) else 0 end)) AS `favorites_count` from `mydatabase`.`favorites` `fav3` group by `mydatabase`.`fav3`.`product_id`) `fav4` on(((`fav4`.`product_id` = `mydatabase`.`p1`.`product_id`) and (`mydatabase`.`sex`.`product_id` = `mydatabase`.`p1`.`product_id`))) join `mydatabase`.`sex` join `mydatabase`.`shops` where ((`mydatabase`.`sex`.`sex` = 0) and (`mydatabase`.`sex`.`product_id` = `mydatabase`.`p1`.`product_id`) and (`mydatabase`.`p1`.`shop_id` = 86) and (`mydatabase`.`sex`.`date` >= (now() - interval 1 day))) order by 'shop.nordstrom.com',`mydatabase`.`sex`.`date`,`mydatabase`.`p1`.`product_id`) `testtable`) `rowed_results` where ((`rowed_results`.`row_number` >= 0) and (`rowed_results`.`row_number` < 7)) | 
+----- 

मैं MySQL क्लाइंट संस्करण चला रहा हूं: 5.1.56। दुकान तालिका में दुकान_आईडी पर प्राथमिक सूचकांक है:

Action Keyname Type Unique Packed Column Cardinality Collation Null Comment 
Edit Drop PRIMARY BTREE Yes No shop_id 163 A 

मैंने दुकान तालिका का विश्लेषण किया है लेकिन इससे मदद नहीं मिली है।

मुझे लगता है कि अगर मैं LEFT JOIN हटाता हूं तो निष्पादन समय में अंतर 0.12 सेकेंड बनाम 0.12 सेकेंड तक गिर जाता है।

सीज़ का समाधान, अर्थात् क्वेरी के 1.6-सेकंड संस्करण का उपयोग करने के लिए और बाहरी क्वेरी (नीचे के रूप में) rowed_results.shop_dummy=86 जोड़कर अप्रासंगिक परिणामों को हटाकर, 1.7 सेकंड में निष्पादित करता है। यह समस्या को हल करता है, लेकिन रहस्य बनी हुई है कि 2 9 2-दूसरी क्वेरी इतनी धीमी क्यों है।

SET @num :=0, @current_shop_id := NULL, @current_product_id := NULL; 

#this query limits the results of the query within it by row number (so that only 250 products get displayed per store) 

SELECT * FROM (

#this query adds row numbers to the query within it 

SELECT *, @num := IF(@current_shop_id = shop_id, IF(@current_product_id=product_id,@num,@num+1), 0) AS row_number, @current_shop_id := shop_id AS shop_dummy, @current_product_id := product_id AS product_dummy FROM (

SELECT shop, shops.shop_id AS 
shop_id, p1.product_id AS 
product_id 
    FROM products p1 LEFT JOIN #this LEFT JOIN gets the favorites count for each product 
    (
    SELECT fav3.product_id AS product_id, SUM(CASE 
    WHEN fav3.current = 1 AND fav3.closeted = 1 THEN 1 
    WHEN fav3.current = 1 AND fav3.closeted = 0 THEN -1 
    ELSE 0 
    END) AS favorites_count 
    FROM favorites fav3 
GROUP BY fav3.product_id 

) AS fav4 ON p1.product_id=fav4.product_id 
    INNER JOIN sex ON sex.product_id=p1.product_id AND sex.sex=0 
    INNER JOIN shops ON shops.shop_id = p1.shop_id 
    WHERE sex.date >= SUBDATE(NOW(),INTERVAL 1 DAY) 


    ORDER BY shop, sex.DATE, product_id 
    ) AS testtable 

) AS rowed_results WHERE 
rowed_results.row_number>=0 AND 
rowed_results.row_number<(7) AND 
rowed_results.shop_dummy=86; 
+1

क्या है "को समझाने विस्तारित .. " "दिखाएं चेतावनी" के बाद के उत्पादन में? – Cez

+0

... कथन के दोनों संस्करणों के लिए? अंतर क्या है यह देखने के लिए 'EXPLAIN' आउटपुट की तुलना करें। एक ही 'WHERE' खंड में सभी कॉलम एक कुंजी में जाना चाहिए। – feeela

+0

@Cez @feela अनुस्मारक के लिए धन्यवाद, मैंने प्रश्न के लिए 'विस्तारित विस्तारित' प्रश्न जोड़े हैं। 'चेतावनी' ने कोई परिणाम नहीं दिया। – jela

उत्तर

1

चैट रूम के बाद, और वास्तव में क्वेरी से मेल खाने के लिए टेबल/कॉलम बनाते हुए, मैं निम्नलिखित क्वेरी के साथ आया हूं।

मैंने सेक्स, उत्पाद (shop_id के लिए) और पसंदीदा तालिका पर होने के लिए अपनी आंतरिक-अधिकांश क्वेरी शुरू की है। चूंकि आपने ShopA = Product ID = 1 पर ProductX का वर्णन किया है लेकिन ShopB = उत्पाद आईडी = 2 (केवल उदाहरण) पर एक ही उत्पाद X, प्रत्येक उत्पाद हमेशा प्रति दुकान अद्वितीय है और कभी भी डुप्लीकेट नहीं होता है। उस ने कहा, मैं इस क्वेरी पर पसंदीदा (अगर कोई है) के साथ उत्पाद और shop_id प्राप्त कर सकता हूं, फिर भी product_id पर समूह .. क्योंकि shop_id प्रति उत्पाद नहीं बदलेगा मैं MAX() का उपयोग कर रहा हूं। चूंकि आप हमेशा "कल" ​​और लिंग (लिंग = 0 मादा) की तारीख से देख रहे हैं, मेरे पास SEX तालिका (दिनांक, लिंग, product_id) पर अनुक्रमित होगा ...मुझे लगता है कि आप हर दिन 1000 आइटम नहीं जोड़ रहे हैं ... उत्पाद स्पष्ट रूप से product_id (प्राथमिक कुंजी) पर एक सूचकांक होगा, और पसंदीदा product_id पर एक अनुक्रमणिका होना चाहिए।

उस परिणाम से (उपनाम "एसएक्सएफएवी") हम उस "उत्पाद_आईडी" द्वारा सीधे "उत्पाद_आईडी" में सीधे शामिल हो सकते हैं ताकि आप जो भी अतिरिक्त जानकारी प्राप्त कर सकें, जैसे दुकान का नाम, तिथि उत्पाद जोड़ा गया हो, उत्पाद विवरण, इत्यादि। इसके परिणामस्वरूप shop_id द्वारा उत्पाद का आदेश दिया जाता है, उत्पाद को उत्पाद, तिथि और अंत में उत्पाद आईडी से बेचा जा रहा है (लेकिन आप आंतरिक क्वेरी पर वर्णन कॉलम को पकड़ने और इसे सॉर्ट-बाय के रूप में उपयोग करने पर विचार कर सकते हैं)। इसके परिणामस्वरूप उपसर्ग "PreQuery" है।

दुकान द्वारा सभी उचित होने के क्रम में, हम अब प्रत्येक उत्पाद को पंक्ति संख्या निर्दिष्ट करने के लिए @MySQLVariable संदर्भ जोड़ सकते हैं, जिस तरह आपने मूल रूप से प्रयास किया था। हालांकि, जब कोई दुकान आईडी बदलती है तो केवल 1 पर रीसेट करें।

SELECT 
     PreQuery.*, 
     @num := IF(@current_shop_id = PreQuery.shop_id, @num +1, 1) AS RowPerShop, 
     @current_shop_id := PreQuery.shop_id AS shop_dummy 
    from 
     (SELECT 
       sxFav.product_id, 
       sxFav.shop_id, 
       sxFav.Favorites_Count 
      from 
       (SELECT 
         sex.product_id, 
         MAX(p.shop_id) shop_id, 
         SUM(CASE WHEN F.current = 1 AND F.closeted = 1 THEN 1 
           WHEN F.current = 1 AND F.closeted = 0 THEN -1 
           ELSE 0 END) AS favorites_count 
        from 
         sex 
         JOIN products p 
          ON sex.Product_ID = p.Product_ID 
         LEFT JOIN Favorites F 
          ON sex.product_id = F.product_ID 
        where 
          sex.date >= subdate(now(), interval 1 day) 
         and sex.sex = 0 
        group by 
         sex.product_id) sxFav 

       JOIN sex 
       ON sxFav.Product_ID = sex.Product_ID 

       JOIN products p 
       ON sxFav.Product_ID = p.Product_ID 
     order by 
     sxFav.shop_id, 
     sex.date, 
     sxFav.product_id) PreQuery, 

    (select @num :=0, 
       @current_shop_id := 0) as SQLVars 

अब, आप देख रहे हैं विशिष्ट "पेजिंग" जानकारी के लिए (दुकान प्रति इस तरह के रूप में 7 प्रविष्टियों), संपूर्ण क्वेरी से ऊपर कुछ की तरह में लपेट ...

select * from (entire query above) where RowPerShop between 1 and 7 

(या 8 के बीच और 14, 15 और 21, आदि की जरूरत के रूप में) या यहाँ तक कि

RowPerShop between RowsPerPage*PageYouAreShowing and RowsPerPage*(PageYouAreShowing +1) 
+0

मैं थोड़ी देर के लिए इसके साथ tinkering रहा हूँ। यह क्वेरी मेरे मुकाबले बहुत तेज है: मेरी मूल क्वेरी के लिए 0.13 सेकंड बनाम 3.4 सेकंड (कुछ बड़े डेटासेट पर जो मैं पहले इस्तेमाल कर रहा था)। मैं sxFav.Product_ID = sex.Product_ID' खंड पर जॉइन सेक्स के बारे में उलझन में हूं। इस खंड को जोड़ना अनपेक्षित परिणामों को पुनर्प्राप्त करने के लिए प्रतीत होता है, क्योंकि क्वेरी का इरादा केवल 'sex.sex = 0' के लिए परिणाम पुनर्प्राप्त करना है, लेकिन वह खंड' sex.sex = 1' के साथ पंक्तियों को भी जोड़ देगा, जब तक वहां है 'sxFav.Product_ID = sex.Product_ID' के लिए एक मैच। मैंने सत्यापित किया कि इसमें 11 अतिरिक्त पंक्तियां शामिल हैं जो मेरी मूल क्वेरी द्वारा वापस नहीं आती हैं। – jela

+0

'आपकी सेक्स से sxFav.Product_ID = sex.Product_ID' पर जॉइन सेक्स को हटाने के कारण यह मेरी मूल क्वेरी के रूप में परिणामों की एक ही संख्या को पुनर्प्राप्त करने का कारण बनता है (' sex.sex = 1' के साथ कोई परिणाम नहीं)। मैं sxFav.Product_ID = p.Product_ID' पर जॉइन उत्पादों के बारे में भी उलझन में हूं, क्योंकि यह जॉइन एसएक्सएफएवी बनाते समय पहले से ही होता है, इसलिए ऐसा लगता है कि मैं केवल sxFav तालिका के भीतर उत्पाद तालिका से प्रासंगिक कॉलम चुन सकता हूं। इस खंड को हटाने से निष्पादन समय बदलना प्रतीत नहीं होता है। मैं गलत समझ सकता हूं कि ये दो खंड क्या कर रहे हैं। – jela

+0

@ जेला, चैट रूम में जारी रखें? मैं अनुसरण करूँगा। – DRapp

1

चर्चा के आधार पर, निचला स्तर पर दुकान निर्दिष्ट करते समय क्वेरी प्लानर बुरी तरह प्रदर्शन कर रहा है।

बाहरी क्वेरी में rowed_results.shop_dummy=86 जोड़ें जो परिणाम आप ढूंढ रहे हैं।

+0

यह आंतरिक क्वेरी द्वारा लौटाए गए अप्रासंगिक परिणामों को खत्म करने के लिए बाहरी क्वेरी को नियोजित करके समस्या हल करता है। मैं उम्मीद के समय के लिए खुला प्रश्न छोड़ दूंगा कि कोई भी आंतरिक क्वेरी के सुधार का सुझाव दे सकता है जो केवल आवश्यक परिणाम देता है, और मेरे 2 9 2-सेकंड संस्करण से अधिक कुशलता से निष्पादित करता है। – jela

1

आप दुकानों के लिए शर्त शामिल हों के लिए shops.shop_id = 86 बढ़ना चाहिए। जॉइन के बाहर इसे रखने का कोई कारण नहीं है, आप पहले MySQL जॉइनिंग का जोखिम चलाते हैं, फिर फ़िल्टरिंग करते हैं। एक जॉइन एक ही काम कर सकता है जहां एक WHERE क्लॉज करता है, खासकर यदि आप अन्य तालिकाओं का संदर्भ नहीं दे रहे हैं।

.... 
INNER JOIN shops ON shops.shop_id = p1.shop_id AND shops.shop_id=86 
.... 

सेक्स के साथ यही बात शामिल हो:

... 
INNER JOIN shops ON shops.shop_id = p1.shop_id 
AND sex.date >= SUBDATE(NOW(),INTERVAL 1 DAY) 
... 

व्युत्पन्न टेबल महान हैं, लेकिन वे उन पर कोई अनुक्रमणिका है। आमतौर पर इससे कोई फर्क नहीं पड़ता क्योंकि वे आमतौर पर रैम में होते हैं। लेकिन बिना किसी इंडेक्स के फ़िल्टरिंग और सॉर्टिंग के बीच, चीजें जोड़ सकती हैं।

ध्यान दें कि दूसरी क्वेरी में जो अधिक समय लेता है, तालिका प्रसंस्करण आदेश बदलता है। दुकान तालिका धीमी क्वेरी में शीर्ष पर है और पी 1 तालिका तेज क्वेरी में 1 पंक्ति के बजाय 1179 9 पंक्तियों को पुनर्प्राप्त करती है। यह प्राथमिक कुंजी का और भी उपयोग नहीं करता है। यह संभावना है कि आपकी समस्या कहां है।

3 DERIVED p1 eq_ref PRIMARY,shop_id,shop_id_2,product_id,shop_id_3 PRIMARY 4 mydatabase.sex.product_id 1 100.00 

3 DERIVED p1 ref PRIMARY,shop_id,shop_id_2,product_id,shop_id_3 shop_id 4  11799 100.00 
+0

मैंने INNER जॉइन स्थितियों को बदल दिया और WHERE क्लॉज को हटा दिया। क्वेरी 283 सेकंड में निष्पादित की गई। मैं सोच रहा हूं कि मैं धीमी क्वेरी को प्राथमिक कुंजी का सही उपयोग करने के लिए कैसे मजबूर कर सकता हूं। – jela

+0

मैंने जॉइन स्थिति में आपके अनुशंसित परिवर्तन के साथ मूल प्रश्न अपडेट किया। साथ ही मैंने देखा कि क्वेरी निष्पादन समय उत्पादों की दुकानों में पंक्तियों की संख्या पर निर्भर करता है, विशेष दुकानों के समान products.shop_id। Shop_id। Product.shop_id = 86 के साथ उत्पाद तालिका में लगभग 34K पंक्तियां हैं, और निष्पादन समय 2 9 2 सेकंड है। Products.shop_id = 50 के लिए, लगभग 28K पंक्तियां हैं, और निष्पादन समय 210 सेकंड है। Products.shop_id = 175 के लिए, लगभग 2K पंक्तियां हैं, और निष्पादन समय 2.8 सेकंड है। मुझे यकीन नहीं है कि इस व्यवहार को सही करने के लिए क्वेरी को कैसे संशोधित करें। – jela

+0

उसी क्वेरी के लिए गति में उस कठोर अंतर के साथ, मेरा पहला अनुमान होगा कि आपकी sort_buffer_size बहुत छोटा है। MySQL में काफी प्रदर्शन ड्रॉप है जब यह काफी बड़ा नहीं है। –

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