Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL पेजिनेशन बिना डबल क्वेरी के?

पारंपरिक पेजिनेशन दो क्वेरी चलाता है: एक 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_ROWS MySQL को सभी मिलान वाली पंक्तियाँ स्कैन करने के लिए मजबूर करता है - बड़े डेटासेट पर धीमा हो सकता है।
  • बड़े टेबल के लिए, अलग 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) ऑफसेट-आधारित से बेहतर प्रदर्शन देता है।
  1. - क्या MySQL में ऑटो_इन्क्रीमेंट मान निर्दिष्ट किए बिना रिकॉर्ड डाल सकते हैं?

    हाँ, बिल्कुल। MySQL में AUTO_INCREMENT कॉलम के लिए मान निर्दिष्ट करना वैकल्पिक है। जब आप INSERT स्टेटमेंट में उस कॉलम को छोड़ देते हैं या NULL/0 पास करते हैं, तो MySQL स्वचालित रूप से अगला अनुक्रमिक मान जनरेट करता है। सिंटैक्स विकल्प -- विकल्प 1: कॉलम सूची में ऑटो_इन्क्रीमेंट कॉलम को छोड़ दें INSER

  1. - mysqldump के बिना MySQL डेटाबेस डुप्लिकेट करना

    CREATE TABLE ... AS SELECT से डेटाबेस कॉपी करना CREATE TABLE db1.table SELECT * FROM db2.table सिंटैक्स से एक डेटाबेस से दूसरे में तालिका संरचना और डेटा दोनों कॉपी हो जाते हैं। स्रोत डेटाबेस और तालिका INSERT INTO DemoTable101 VALUES(101, Sam), (102, Bob), (103, David); लक्ष्य डेटाबेस में कॉपी C

  1. - MySQL में अगली पंक्ति पेजिनेशन कैसे चुनें?

    LIMIT क्लॉज LIMIT offset, row_count से पेजिनेशन लागू करें। उदाहरण insert into demo40(name) values(Chris), (David), (Mike), (Sam), (Carol), (bob); 5वीं और 6वीं पंक्ति प्राप्त करना (offset=4, count=2) select * from demo40 limit 4,2; +----+-------+ | id | name | +----+-------+ | 5 | Carol | | 6