मुझे आश्चर्य है कि या तो तेज है। मैं उन्हें 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
. का जोड़ बाहरी टेबल पर इसे फेंक देता है।