परिचय
MySQL में ORDER BY RAND() का उपयोग करके टेबल की पंक्तियों को यादृच्छिक क्रम में प्राप्त किया जा सकता है, जिससे प्रभावी रूप से कॉलम मान "शफ़ल" हो जाते हैं।
उदाहरण: टेबल बनाना और डेटा डालना
mysql> CREATE TABLE DemoTable1557 (
-> SubjectId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> SubjectName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.91 sec)
mysql> INSERT INTO DemoTable1557(SubjectName) VALUES('MySQL');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable1557(SubjectName) VALUES('MongoDB');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable1557(SubjectName) VALUES('Java');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable1557(SubjectName) VALUES('C');
Query OK, 1 row affected (0.13 sec)
सभी रिकॉर्ड देखना (मूल क्रम)
mysql> SELECT * FROM DemoTable1557;
आउटपुट:
+-----------+-------------+
| SubjectId | SubjectName |
+-----------+-------------+
| 1 | MySQL |
| 2 | MongoDB |
| 3 | Java |
| 4 | C |
+-----------+-------------+
4 rows in set (0.00 sec)
शफ़ल करने की क्वेरी
mysql> SELECT * FROM DemoTable1557 ORDER BY RAND();
परिणाम (उदाहरण - हर बार अलग होगा)
+-----------+-------------+
| SubjectId | SubjectName |
+-----------+-------------+
| 1 | MySQL |
| 3 | Java |
| 2 | MongoDB |
| 4 | C |
+-----------+-------------+
4 rows in set (0.00 sec)
व्याख्या
ORDER BY RAND()प्रत्येक पंक्ति के लिए एक यादृच्छिक संख्या उत्पन्न करता है और उसके आधार पर क्रमबद्ध करता है- हर निष्पादन पर अलग क्रम मिलता है
SubjectIdमूल क्रम बनाए रखता है (यह केवल प्रदर्शन क्रम बदलता है)
प्रदर्शन नोट
ORDER BY RAND() बड़े टेबल पर धीमा होता है क्योंकि:
- प्रत्येक पंक्ति के लिए रैंडम मान उत्पन्न करना पड़ता है
- इंडेक्स उपयोग नहीं कर सकता
- टेम्पररी टेबल और फाइलसॉर्ट की आवश्यकता होती है
बड़े टेबल के लिए विकल्प
-- 1. रैंडम ऑफसेट (तेज़, लेकिन पूरी तरह रैंडम नहीं)
SELECT * FROM DemoTable1557
WHERE SubjectId >= (SELECT FLOOR(RAND() * (SELECT MAX(SubjectId) FROM DemoTable1557)))
ORDER BY SubjectId LIMIT 4;
-- 2. एप्लिकेशन लेवल पर शफ़ल (सबसे तेज़)
-- सभी ID लाएं, एप्लिकेशन में शफ़ल करें, फिर IN क्लॉज से प्राप्त करें
छोटे टेबल (कुछ हजार पंक्तियों तक) के लिए ORDER BY RAND() पूरी तरह ठीक है।