IN() ऑपरेटर से तेज क्वेरी एक्जीक्यूशन
MySQL में IN() ऑपरेटर आंतरिक रूप से बाइनरी सर्च (इंडेक्स होने पर) का उपयोग करता है, जिससे यह कई OR कंडीशन्स की तुलना में तेज होता है।
टेबल बनाना और डेटा इन्सर्ट करना
CREATE TABLE DemoTable1618 (
ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName VARCHAR(20),
ClientEmailId VARCHAR(30)
);
INSERT INTO DemoTable1618(ClientName, ClientEmailId) VALUES('Chris Brown', 'Brown323@gmail.com');
INSERT INTO DemoTable1618(ClientName, ClientEmailId) VALUES('David Miller', 'MillerDavid@gmail.com');
INSERT INTO DemoTable1618(ClientName, ClientEmailId) VALUES('John Doe', '998John_Doe@gmail.com');
INSERT INTO DemoTable1618(ClientName, ClientEmailId) VALUES('John Smith', '999John_Smith@gmail.com');
INSERT INTO DemoTable1618(ClientName, ClientEmailId) VALUES('Adam Smith', 'Adam_Smith@gmail.com');
मौजूदा डेटा
+----------+--------------+-------------------------+ | ClientId | ClientName | ClientEmailId | +----------+--------------+-------------------------+ | 1 | Chris Brown | Brown323@gmail.com | | 2 | David Miller | MillerDavid@gmail.com | | 3 | John Doe | 998John_Doe@gmail.com | | 4 | John Smith | 999John_Smith@gmail.com | | 5 | Adam Smith | Adam_Smith@gmail.com | +----------+----------+-------------------------+
धीमा तरीका: कई OR कंडीशन्स
SELECT * FROM DemoTable1618 WHERE ClientEmailId = '998John_Doe@gmail.com' OR ClientEmailId = '999John_Smith@gmail.com' OR ClientEmailId = 'MillerDavid@gmail.com';
तेज तरीका: IN() ऑपरेटर
SELECT * FROM DemoTable1618
WHERE ClientEmailId IN('998John_Doe@gmail.com', '999John_Smith@gmail.com', 'MillerDavid@gmail.com');
आउटपुट
+----------+--------------+-------------------------+ | ClientId | ClientName | ClientEmailId | +----------+--------------+-------------------------+ | 2 | David Miller | MillerDavid@gmail.com | | 3 | John Doe | 998John_Doe@gmail.com | | 4 | John Smith | 999John_Smith@gmail.com | +----------+--------------+-------------------------+
क्यों IN() तेज है
- MySQL
IN()लिस्ट को सॉर्ट करके बाइनरी सर्च करता है (O(log n) प्रति लुकअप) ORचेन का मूल्यांकन क्रमिक होता है (O(n) प्रति रो)- इंडेक्स होने पर
IN()रेंज स्कैन जैसा व्यवहार करता है - कॉन्स्टेंट लिस्ट के लिए ऑप्टिमाइज़र बेहतर प्लान बनाता है
बड़े IN() लिस्ट के लिए टिप्स
- बहुत बड़े लिस्ट (1000+) के लिए अस्थायी टेबल या JOIN बेहतर
IN (SELECT ...)सबक्वेरी का उपयोग करें- मान पैरामीटराइज़्ड क्वेरी में पास करें
इंडेक्स बनाना (जरूरी)
CREATE INDEX idx_client_email ON DemoTable1618(ClientEmailId);
इंडेक्स के बिना दोनों तरीके फुल टेबल स्कैन करेंगे।
NOT IN के लिए सावधानी
-- NULL वैल्यू होने पर NOT IN अनपेक्षित परिणाम दे सकता है
WHERE Email NOT IN ('a@b.com', NULL) -- हमेशा FALSE/UNKNOWN लौटाता है
-- बेहतर:
WHERE Email NOT IN ('a@b.com') AND Email IS NOT NULL
-- या
WHERE NOT EXISTS (SELECT 1 FROM excluded WHERE email = DemoTable1618.ClientEmailId)