MySQL में COUNT(DISTINCT column) क्वेरी बड़े डेटासेट पर धीमी चल सकती है। इसे तेज़ करने का सबसे प्रभावी तरीका संबंधित कॉलम पर **इंडेक्स (Index)** बनाना है। इंडेक्स डेटाबेस को विशिष्ट मानों को तेज़ी से खोजने और गिनने में सक्षम बनाता है, बिना पूरी टेबल को स्कैन किए।
उदाहरण: इंडेक्स के साथ COUNT DISTINCT ऑप्टिमाइज़ करना
सबसे पहले एक डेमो टेबल बनाते हैं जिसमें FirstName और LastName पर एक कंपोजिट इंडेक्स हो:
mysql> CREATE TABLE DemoTable1905 (
FirstName VARCHAR(20),
LastName VARCHAR(20),
INDEX F_L_Name (FirstName, LastName)
);
कुछ सैंपल डेटा इन्सर्ट करें:
mysql> INSERT INTO DemoTable1905 VALUES
('John','Smith'),
('John','Doe'),
('Adam','Smith'),
('John','Doe'),
('Chris','Brown'),
('Adam','Smith');
टेबल का डेटा देखें:
mysql> SELECT * FROM DemoTable1905; +-----------+----------+ | FirstName | LastName | +-----------+----------+ | Adam | Smith | | Adam | Smith | | Chris | Brown | | John | Doe | | John | Doe | | John | Smith | +-----------+----------+
अब FirstName के विशिष्ट मानों को गिनें:
mysql> SELECT COUNT(DISTINCT FirstName) FROM DemoTable1905;
आउटपुट:
+---------------------------+ | count(distinct FirstName) | +---------------------------+ | 3 | +---------------------------+परफॉरमेंस टिप्स
- इंडेक्स बनाएं: जिस कॉलम पर
DISTINCTलागू हो रहा है, उस पर इंडेक्स ज़रूर बनाएं। - कंपोजिट इंडेक्स: अगर आप एकाधिक कॉलम पर
COUNT(DISTINCT col1, col2)कर रहे हैं, तो कंपोजिट इंडेक्स बनाएं। - कवरिंग इंडेक्स: InnoDB में, सेकेंडरी इंडेक्स में प्राइमरी की वैल्यू शामिल होती है, इसलिए इंडेक्स-ओनली स्कैन संभव है।
- अनुमानित गिनती: बहुत बड़ी टेबल्स के लिए,
EXPLAINयाINFORMATION_SCHEMAसे अनुमानित गिनती लेना तेज़ हो सकता है।
सही इंडेक्सिंग से COUNT(DISTINCT) क्वेरीज़ की परफॉरमेंस नाटकीय रूप से सुधर सकती है, खासकर जब लाखों रिकॉर्ड हों।