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

MySQL विशाल टेबल जॉइन डेटाबेस को ध्वस्त कर देता है

300k पंक्तियाँ एक बड़ी तालिका नहीं है। हम अक्सर 300 मिलियन रो टेबल देखते हैं।

आपकी क्वेरी के साथ सबसे बड़ी समस्या यह है कि आप एक सहसंबद्ध सबक्वेरी का उपयोग कर रहे हैं, इसलिए इसे प्रत्येक पंक्ति के लिए सबक्वेरी को फिर से निष्पादित करना होगा। बाहरी क्वेरी में।

अक्सर ऐसा होता है कि आपको सब करने की आवश्यकता नहीं होती है एक SQL कथन में आपका कार्य। इसे कई सरल SQL कथनों में विभाजित करने के फायदे हैं:

  • कोड करने में आसान।
  • अनुकूलित करना आसान है।
  • डीबग करना आसान है।
  • पढ़ने में आसान।
  • यदि आपको नई आवश्यकताओं को लागू करना है तो इसे बनाए रखना आसान है।

खरीदारी की संख्या

SELECT customer, COUNT(sale) AS number_of_purchases
FROM sales 
GROUP BY customer;

इस क्वेरी के लिए बिक्री (ग्राहक, बिक्री) पर एक सूचकांक सबसे अच्छा होगा।

पिछली खरीद मूल्य

यह महानतम-n-प्रति-समूह है समस्या जो बार-बार सामने आती है।

SELECT a.customer, a.sale as max_sale
FROM sales a
LEFT OUTER JOIN sales b
 ON a.customer=b.customer AND a.dates < b.dates
WHERE b.customer IS NULL;

दूसरे शब्दों में, पंक्ति a . से मिलान करने का प्रयास करें एक काल्पनिक पंक्ति के लिए b जिसका एक ही ग्राहक और एक बड़ी तिथि है। यदि ऐसी कोई पंक्ति नहीं मिलती है, तो a उस ग्राहक के लिए सबसे बड़ी तिथि होनी चाहिए।

इस क्वेरी के लिए बिक्री पर एक सूचकांक (ग्राहक, तिथियां, बिक्री) सबसे अच्छा होगा।

यदि आपके पास उस सबसे बड़ी तिथि पर किसी ग्राहक के लिए एक से अधिक बिक्री हो सकती है, तो यह क्वेरी प्रति ग्राहक एक से अधिक पंक्तियाँ लौटाएगी। टाई को तोड़ने के लिए आपको एक और कॉलम ढूंढना होगा। यदि आप ऑटो-इन्क्रीमेंट प्राथमिक कुंजी का उपयोग करते हैं, तो यह टाई ब्रेकर के रूप में उपयुक्त है क्योंकि यह अद्वितीय होने की गारंटी है और यह कालानुक्रमिक रूप से बढ़ता है।

SELECT a.customer, a.sale as max_sale
FROM sales a
LEFT OUTER JOIN sales b
 ON a.customer=b.customer AND (a.dates < b.dates OR a.dates = b.dates and a.id < b.id)
WHERE b.customer IS NULL;

खरीदारी की कुल राशि, जब इसका सकारात्मक मूल्य हो

SELECT customer, SUM(sale) AS total_purchases
FROM sales
WHERE sale > 0
GROUP BY customer;

इस क्वेरी के लिए बिक्री (ग्राहक, बिक्री) पर एक सूचकांक सबसे अच्छा होगा।

आपको -1 के बजाय अनुपलब्ध बिक्री मूल्य को दर्शाने के लिए NULL का उपयोग करने पर विचार करना चाहिए। SUM () और COUNT () जैसे कुल कार्य NULLs को अनदेखा करते हैं, इसलिए आपको <0 की बिक्री वाली पंक्तियों को बाहर करने के लिए WHERE क्लॉज का उपयोग करने की आवश्यकता नहीं है।

पुन:आपकी टिप्पणी

Q4 2012 के लिए शीर्ष पांच ग्राहक

SELECT customer, SUM(sale) AS total_purchases
FROM sales
WHERE (year, quarter) = (2012, 4) AND sale > 0
GROUP BY customer
ORDER BY total_purchases DESC
LIMIT 5;

मैं वास्तविक डेटा के खिलाफ इसका परीक्षण करना चाहता हूं, लेकिन मेरा मानना ​​​​है कि इस क्वेरी के लिए बिक्री (वर्ष, तिमाही, ग्राहक, बिक्री) पर एक सूचकांक सबसे अच्छा होगा।

कुल खरीदारियों वाले ग्राहकों के लिए अंतिम खरीदारी> 5

SELECT a.customer, a.sale as max_sale
FROM sales a
INNER JOIN sales c ON a.customer=c.customer
LEFT OUTER JOIN sales b
 ON a.customer=b.customer AND (a.dates < b.dates OR a.dates = b.dates and a.id < b.id)
WHERE b.customer IS NULL
GROUP BY a.id
HAVING COUNT(*) > 5;

जैसा कि ऊपर दी गई अन्य सबसे बड़ी-एन-प्रति-समूह क्वेरी में है, इस क्वेरी के लिए बिक्री (ग्राहक, तिथियां, बिक्री) पर एक सूचकांक सबसे अच्छा होगा। यह शायद शामिल होने और समूह दोनों को अनुकूलित नहीं कर सकता है, इसलिए इसमें एक अस्थायी तालिका होगी। लेकिन कम से कम यह कई के बजाय केवल एक अस्थायी तालिका ही करेगा।

ये प्रश्न काफी जटिल हैं। आपको एक भी SQL क्वेरी लिखने की कोशिश नहीं करनी चाहिए जो सब . दे सके इन परिणामों में से। ब्रायन कर्निघन का क्लासिक उद्धरण याद रखें:



  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. किसी अन्य चयन के मूल्य के आधार पर चयन कैसे करें

  3. डेटा को डीकोड करने का प्रयास कर रहा है (Abs को MySQL में निर्यात करना)

  4. शेल स्क्रिप्ट स्वचालित रूप से mysql नींद प्रक्रियाओं को मारने के लिए

  5. यह MySQL क्वेरी क्यों लटकती है?