माई एसक्यूएल
यदि आप क्लॉज़ को भूल जाते हैं और सभी स्थितियों को ऑन एक्सप्रेशन में रखते हैं तो आपको सबसे अच्छा प्रदर्शन मिलेगा।
मुझे लगता है कि यह इसलिए है क्योंकि क्वेरी को पहले तालिकाओं में शामिल करना होता है, फिर उस पर क्लॉज़ को चलाता है, इसलिए यदि आप इसमें शामिल होने के लिए आवश्यक चीज़ों को कम कर सकते हैं तो परिणाम प्राप्त करने के लिए तेज़ तरीका है और udpate करें।
उदाहरण
परिदृश्य
आपके पास उपयोगकर्ताओं की एक तालिका है। वे अपने उपयोगकर्ता नाम या ईमेल या account_number का उपयोग करके लॉग इन कर सकते हैं। ये खाते सक्रिय (1) या निष्क्रिय (0) हो सकते हैं। इस तालिका में 50000 पंक्तियाँ हैं
फिर आपके पास एक बार में अक्षम करने के लिए उपयोगकर्ताओं की एक तालिका होती है क्योंकि आपको पता चलता है कि वे सभी कुछ खराब कर चुके हैं। इस तालिका में, उपयोगकर्ता नाम, ईमेल और खाता संख्याओं के साथ एक कॉलम है। इसमें एक "has_run" संकेतक भी है जिसे चलाने पर इसे 1 (सही) पर सेट करने की आवश्यकता होती है
सवाल
UPDATE users User
INNER JOIN
blacklist_users BlacklistUser
ON
(
User.username = BlacklistUser.account_ref
OR
User.email = BlacklistedUser.account_ref
OR
User.phone_number = BlacklistUser.account_ref
AND
User.is_active = 1
AND
BlacklistUser.has_run = 0
)
SET
User.is_active = 0,
BlacklistUser.has_run = 1;
विचार
अगर हमें सिर्फ OR शर्तों पर शामिल होना था तो अनिवार्य रूप से प्रत्येक पंक्ति को 4 बार जांचना होगा कि क्या उसे शामिल होना चाहिए या नहीं, और संभवतः बहुत अधिक पंक्तियों को वापस करना होगा। हालाँकि, इसे और अधिक शर्तें देकर यह बहुत सी पंक्तियों को "छोड़" सकता है यदि वे शामिल होने पर सभी शर्तों को पूरा नहीं करते हैं।
बक्शीश
यह अधिक पठनीय है। सभी स्थितियाँ एक स्थान पर हैं और अद्यतन करने के लिए पंक्तियाँ एक ही स्थान पर हैं