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

JOIN और GROUP BY के प्रदर्शन को बेहतर बनाने के लिए कौन से इंडेक्स हैं?

प्रो टिप SELECT * . से बचें या SELECT table.* प्रदर्शन-संवेदनशील प्रश्नों में। इसके बजाय, नाम से उन स्तंभों का चयन करें जिनका आपको वास्तव में उपयोग करने की आवश्यकता है

प्रो टिप MySQL के पास GROUP BY . के लिए एक कुख्यात गैर-मानक एक्सटेंशन है जिसका आप उपयोग कर रहे हैं, और संभवतः दुरुपयोग कर रहे हैं। इस पढ़ें। https://dev.mysql.com/doc /refman/8.0/hi/group-by-handling.html यदि आप पहले प्रो टिप का पालन करते हैं, तो दूसरे का अनुसरण करना बहुत आसान होगा।

प्रो टिप अपने प्रश्नों में तेजी लाने की उम्मीद में बहुत सारे सिंगल कॉलम इंडेक्स "फेंकने" से बचें। इसके बजाय, अपनी वास्तविक क्वेरी की ज़रूरतों से मेल खाने वाले इंडेक्स, अक्सर कंपाउंड इंडेक्स बनाएं। इसे पढ़ें https://use-the-index-luke.com

प्रो टिप Using temporary; using filesort EXPLAIN आउटपुट में दिखना जरूरी नहीं कि खराब हो। इसका सीधा सा मतलब है कि क्वेरी इंजन को इसे वापस करने से पहले आंशिक परिणाम सेट को कैश करना होगा। temporary बात एक वास्तविक तालिका नहीं है, यह एक RAM संरचना है। यदि यह इतना बड़ा है तो यह RAM को स्वैप कर देता है, MySQL इसे डिस्क पर फैला देगा। लेकिन आपका नहीं है।

जो कुछ कहा जा रहा है, आइए आपकी क्वेरी को दोबारा दोहराएं। मुझे लगता है कि आप सबसे बड़ी idCartDATA वाली पंक्तियों को पुनः प्राप्त करना चाहते हैं प्रत्येक CartSplitData.SUPPLIERID . के लिए मान ।

तो चलिए इसे एक सबक्वेरी के रूप में लिखते हैं।

                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID

CartSplitData:(SUPPLIERID, IDCartDATA) पर एक कंपाउंड इंडेक्स लगाकर इस क्वेरी को नाटकीय रूप से तेज किया जा सकता है। ।

इसके बाद, उस सबक्वेरी में आईडी से मेल खाने वाली पंक्तियों को खोजने के लिए अपनी मुख्य क्वेरी को फिर से लिखें।

SELECT CartData.*             /* * hammers performance */
       CartSplitData.*        /* * hammers performance */
  FROM CartData
  JOIN CartSplitData ON CartSplitData.IDCartDATA = CartDATA.IDCartData
  JOIN (
                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID
       )x ON x.SUPPLIERID = CartSplitData.SUPPLIERID
         AND x.IDCartData = CartSplitData.IDCartData
 WHERE CartData.CartOrderref = 'XXXXXXXXX'

CartData.CartOrderref . पर आपकी अनुक्रमणिका इस बाहरी क्वेरी में मदद करेगा, जैसा कि ^^^ बनाया गया कंपाउंड इंडेक्स होगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql php . के अंदर गलत उत्तर देने का चयन करें

  2. अन्य फ़ील्ड के मान के रूप में MySQL डिफ़ॉल्ट मान

  3. पायथन कर्सर का उपयोग करके संग्रहीत कार्यविधि से परिणाम नहीं लौटा सकता

  4. mysql में तालिका के सभी क्षेत्रों के साथ मूल्य की तुलना करें

  5. MySQL टेबल्स को नाम देने के लिए चीनी अक्षरों का उपयोग करना