पारंपरिक पेजिनेशन दो क्वेरी चलाता है: एक COUNT(*) कुल पंक्तियों के लिए, दूसरी डेटा के लिए। MySQL में SQL_CALC_FOUND_ROWS और FOUND_ROWS() से इसे एक क्वेरी में कर सकते हैं।
विधि: SQL_CALC_FOUND_ROWS
-- डेटा लाएं + कुल गिनती कैलकुलेट करें
SELECT SQL_CALC_FOUND_ROWS id, name
FROM RowCountDemo
WHERE id > 0
LIMIT 0, 5;
-- फिर कुल पंक्तियाँ प्राप्त करें (दूसरी क्वेरी, लेकिन सस्ती)
SELECT FOUND_ROWS();
उदाहरण
mysql> CREATE TABLE RowCountDemo (ID INT, Name VARCHAR(100));
mysql> INSERT INTO RowCountDemo VALUES
(1,'Larry'), (2,'John'), (3,'Bela'), (4,'Jack'), (5,'Eric'),
(6,'Rami'), (7,'Sam'), (8,'Maike'), (9,'Rocio'), (10,'Gavin');
mysql> SELECT SQL_CALC_FOUND_ROWS ID, Name FROM RowCountDemo WHERE ID > 0 LIMIT 0, 5;
+----+-------+
| ID | Name |
+----+-------+
| 1 | Larry |
| 2 | John |
| 3 | Bela |
| 4 | Jack |
| 5 | Eric |
+----+-------+
mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
| 10 |
+--------------+
प्रदर्शन नोट
SQL_CALC_FOUND_ROWSMySQL को सभी मिलान वाली पंक्तियाँ स्कैन करने के लिए मजबूर करता है - बड़े डेटासेट पर धीमा हो सकता है।- बड़े टेबल के लिए, अलग
COUNT(*)क्वेरी (उचित इंडेक्स के साथ) अक्सर तेज़ होती है। - MySQL 8.0.17+ में
SQL_CALC_FOUND_ROWSडिप्रिकेटेड है।
आधुनिक विकल्प (MySQL 8.0+)
-- विंडो फंक्शन के साथ (सिंगल क्वेरी)
SELECT id, name, COUNT(*) OVER() AS total_count
FROM RowCountDemo
WHERE id > 0
LIMIT 5 OFFSET 0;
यह एक ही क्वेरी में पेज डेटा और कुल गिनती दोनों देता है।
सर्वोत्तम अभ्यास
- छोटे/मध्यम टेबल:
SQL_CALC_FOUND_ROWSया विंडो फंक्शन। - बड़े टेबल: अलग अनुकूलित
COUNT(*)+ डेटा क्वेरी। - कर्सर-आधारित पेजिनेशन (keyset pagination) ऑफसेट-आधारित से बेहतर प्रदर्शन देता है।