Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

मैसकल स्लो क्वेरी:जॉइन + मल्टीपल WHERES + ऑर्डर बाय

इंडेक्स mysql में एक बड़ा अंतर बनाते हैं, एक क्वेरी जिसमें इंडेक्स के गलत सेट के साथ 15 मिनट लगते हैं, सही वाले के साथ 2 सेकंड लगते हैं, लेकिन इसका सही संतुलन ढूंढना आम तौर पर मुद्दा है। स्वाभाविक रूप से कुछ नमूना डेटा के बिना यह कहना मुश्किल है कि नीचे दिया गया समाधान आपको किसी भी समय बचाएगा, लेकिन सिद्धांत रूप में यह होना चाहिए।

आपके सवालों के जवाब देने के लिए, मैं टेबल को इस तरह से नया स्वरूप दूंगा:

CREATE TABLE `product_all` ( 
`prod_id` INT( 10 ) NOT NULL, 
`ref_id` INT( 10) NOT NULL, 
`date` DATE NOT NULL , 
`buy_link` BLOB NOT NULL , 
`sale_price` FLOAT NOT NULL,
PRIMARY KEY (prod_id, ref_id) ,
INDEX date_Index (`date` ASC),
UNIQUE INDEX prod_price_Index (prod_id ASC, sale_price ASC)
) ENGINE = MYISAM ; 


CREATE TABLE `product_info` ( 
`prod_id` INT( 10 ) NOT NULL AUTO_INCREMENT, 
`prod_name` VARCHAR( 200 ) NOT NULL, 
`brand` VARCHAR( 50 ) NOT NULL, 
`retail_price` FLOAT NOT NULL, 
`category` INT( 3 ) NOT NULL, 
`gender` VARCHAR( 1 ) NOT NULL, 
`type` VARCHAR( 10 ) NOT NULL,
PRIMARY KEY (prod_id) ,
UNIQUE INDEX prod_id_name_Index (prod_id ASC, prod_name ASC),
INDEX category_Index (category ASC),
INDEX gender_Index (gender ASC)
) ENGINE = MYISAM ;

SELECT product_info.*, MIN(product_all.sale_price) as sale_price, product_all.buy_link         
FROM product_info         
NATURAL JOIN (SELECT * FROM product_all WHERE product_all.date = '2010-09-30') as product_all         
WHERE (product_info.category = 2           
AND product_info.gender = 'W' )         
GROUP BY product_all.prod_id         
ORDER BY MIN(product_all.sale_price) ASC LIMIT 13        

यहां प्रदर्शन लाभ मुख्य क्षेत्रों में मेरी अनुक्रमणिका प्राप्त हुआ है जिसमें शामिल किया जा रहा है और जहां खंड में दिखाया गया है। व्यक्तिगत रूप से मैं आपकी पहली क्वेरी के साथ जाऊंगा जब आप इसके बारे में सोचते हैं जो बेहतर प्रदर्शन करना चाहिए।

जहाँ तक मैं समझता हूँ कि पहली और दूसरी क्वेरी में क्या हो रहा है:

  • प्राकृतिक जुड़ाव करने से पहले पहली क्वेरी को उप-क्वेरी द्वारा फ़िल्टर किया जा रहा है, जिसका अर्थ है कि यह परिणामी डेटा में केवल शामिल है, न कि संपूर्ण तालिका में।
  • दूसरी क्वेरी पूरी दूसरी तालिका में शामिल हो रही है और फिर परिणामी पंक्तियों को पूरी तरह से फ़िल्टर कर रही है जो आप चाहते हैं।

अंगूठे के एक नियम के रूप में आम तौर पर आप अपने प्रमुख जॉइनिंग फ़ील्ड्स और उन फ़ील्ड्स पर इंडेक्स जोड़ना चाहते हैं, जहां आप क्लॉज में सबसे अधिक उपयोग करते हैं। मैंने कुछ क्षेत्रों में कुछ अद्वितीय सूचकांक भी रखे हैं जिन्हें आप नियमित रूप से पूछना चाहेंगे, जैसे कि prod_id_name_Index।

यदि यह आपके प्रदर्शन में सुधार नहीं करता है यदि आप शायद कुछ डमी डेटा पोस्ट कर सकते हैं तो मैं एक तेज़ समाधान प्राप्त करने में सक्षम हो सकता हूं जिसे मैं बेंचमार्क कर सकता हूं।

यहां एक लेख है जो MySQL में प्रदर्शन के लिए अनुक्रमण के माध्यम से जाता है, अगर आप और जानना चाहते हैं तो पढ़ने लायक है।

शुभकामनाएँ!

संपादित करें:आपका अंतिम प्रश्न मैंने पहली बार याद किया, इसका उत्तर यह है कि यदि आप मुख्य जुड़ने वाले क्षेत्रों को अनुक्रमित करते हैं, तो उस स्थान में परिवर्तन होता है, जो केवल समग्र प्रदर्शन को थोड़ा प्रभावित करेगा, लेकिन मैंने जो अद्वितीय सूचकांक टेबल पर रखे हैं, उनका हिसाब होना चाहिए अधिकांश चीजें जिन पर आप प्रश्नों को आधार बनाना चाहेंगे। याद रखने वाली मुख्य बात यह है कि यदि आप किसी फ़ील्ड से बार-बार पूछताछ करते हैं या उससे जुड़ते हैं तो उसे वास्तव में अनुक्रमित किया जाना चाहिए, लेकिन मामूली प्रश्नों और आपके द्वारा क्रम में किए गए परिवर्तनों को केवल अपनी अनुक्रमण रणनीति को पुन:संरेखित करने के बारे में चिंता नहीं करनी चाहिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक टेबल को कई टेबल से जोड़ना

  2. MySQL वाक्पटु लार्वा में शामिल हों और और के लिए

  3. Mysqld.service के लिए कार्य विफल रहा systemctl स्थिति देखें mysqld.service

  4. डालने के बाद mySQL रिटर्न इंडेक्स

  5. डेटा को पार्स करने में त्रुटि org.json.JSONException:वर्ण 0 पर इनपुट का अंत - Android