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

यह MySQL क्वेरी (शून्य जांच के साथ) इस दूसरे की तुलना में इतनी धीमी क्यों है?

मुझे आश्चर्य है कि या तो तेज है। मैं उन्हें exists with से बदलने का सुझाव दूंगा :

SELECT COUNT(*)
FROM ips_usuario u  
WHERE EXISTS (SELECT 1 FROM ips_fatura f WHERE u.id = f.ips_usuario_id) OR
      EXISTS (SELECT 1 FROM ips_fatura f WHERE u.ips_usuario_id_titular = f.ips_usuario_id);

और दूसरे के लिए:

SELECT COUNT(*)
FROM ips_usuario u  
WHERE EXISTS (SELECT 1 FROM ips_fatura f WHERE u.id = f.ips_usuario_id) OR
      (u.ips_usuario_id_titular IS NOT NULL AND
       EXISTS (SELECT 1 FROM ips_fatura f WHERE u.ips_usuario_id_titular = f.ips_usuario_id)
      )

इन दोनों के लिए, आपको दो इंडेक्स चाहिए:ips_fatura(ips_usuario_id) और ips_fatura(ips_usuario_id_titular) . आप यह सुनिश्चित करने के लिए व्याख्या की जांच कर सकते हैं कि EXISTS सूचकांक का उपयोग कर रहा है। यदि नहीं, तो MySQL के नए रिलीज़ IN . के लिए अनुक्रमणिका का उपयोग करते हैं :

SELECT COUNT(*)
FROM ips_usuario u  
WHERE u.id IN (SELECT f.ips_usuario_id FROM ips_fatura f) OR
      u.ips_usuario_id_titular IN (SELECT f.ips_usuario_id FROM ips_fatura f);

किसी भी स्थिति में (EXISTS या IN ) लक्ष्य "सेमी-जॉइन" करना है। यानी सभी मैचों के बजाय मैच के साथ केवल पहली पंक्ति को ठीक करना। यह एक महत्वपूर्ण दक्षता है, क्योंकि यह क्वेरी को दोहराव हटाने से बचने की अनुमति देता है।

मैं अनुमान लगाता हूँ कि समस्या or . का अनुकूलन है -- आमतौर पर इसका परिणाम अक्षम होता है JOIN एल्गोरिदम हालाँकि, शायद MySQL आपके पहले मामले में स्मार्ट है। लेकिन IS NULL . का जोड़ बाहरी टेबल पर इसे फेंक देता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्प्रिंगडेटा के साथ स्ट्रिंग को @Id के रूप में उपयोग नहीं कर सकता

  2. पता लगाएँ कि क्या किसी तालिका में CASCADE पर DELETE है

  3. कैसे mysql क्वेरी से अजगर स्क्रिप्ट चलाने के लिए?

  4. MySQL GROUP BY विभिन्न तालिकाओं से कई कॉलम

  5. MySQL JSON प्रकार के साथ स्प्रिंग डेटा