MySQL में पंक्तियाँ गिनने के कई तरीके हैं, जिनके प्रदर्शन में बड़ा अंतर हो सकता है।
तरीके और प्रदर्शन तुलना
| क्वेरी | विवरण | प्रदर्शन |
|---|---|---|
SELECT COUNT(*) FROM table | सभी पंक्तियाँ गिनता है (InnoDB में फुल टेबल स्कैन) | धीमा (बड़े टेबल पर) |
SELECT COUNT(1) FROM table | COUNT(*) के समान, कोई अंतर नहीं | धीमा |
SELECT COUNT(column) FROM table | केवल गैर-NULL मान गिनता है | धीमा |
SHOW TABLE STATUS LIKE 'table' | अनुमानित गिनती (InnoDB में सटीक नहीं) | बहुत तेज़ |
SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES... | अनुमानित गिनती | तेज़ |
| ट्रिगर + काउंटर टेबल | सटीक रीयल-टाइम गिनती | सबसे तेज़ पढ़ने के लिए |
उदाहरण: COUNT(*) बनाम SHOW TABLE STATUS
mysql> SELECT COUNT(*) FROM RowCountDemo;
+----------+
| COUNT(*) |
+----------+
| 10 |
+----------+
1 row in set (0.00 sec)
mysql> SHOW TABLE STATUS LIKE 'RowCountDemo';
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| RowCountDemo | InnoDB | 10 | Dynamic | 10 | 1638 | 16384 | 0 | 0 | 0 | NULL | 2018-10-18 13:14:30 | NULL | NULL | utf8mb4_unicode_ci | NULL | | |
+--------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
Rows कॉलम अनुमानित गिनती दिखाता है (InnoDB में सटीक नहीं)।
सटीक गिनती के लिए सर्वोत्तम अभ्यास
- छोटे/मध्यम टेबल:
SELECT COUNT(*) FROM table- सरल और सटीक। - बड़े टेबल (लाखों+ पंक्तियाँ): काउंटर टेबल + ट्रिगर बनाएं।
- अनुमानित गिनती स्वीकार्य है:
SHOW TABLE STATUSयाINFORMATION_SCHEMA।
काउंटर टेबल पैटर्न
CREATE TABLE table_counts (
table_name VARCHAR(64) PRIMARY KEY,
row_count BIGINT UNSIGNED NOT NULL DEFAULT 0
);
-- ट्रिगर INSERT/DELETE पर काउंटर अपडेट करते हैं
नोट
MyISAM में COUNT(*) तात्कालिक होता है क्योंकि पंक्ति गिनती मेटाडेटा में स्टोर होती है। InnoDB में MVCC के कारण ऐसा नहीं होता।