Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Xáo trộn thứ tự hàng (shuffle) trong MySQL với ORDER BY RAND()

Giới thiệu

Sử dụng ORDER BY RAND() để trả về các hàng theo thứ tự ngẫu nhiên mỗi lần truy vấn.

1. Tạo bảng và dữ liệu

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)

2. Dữ liệu gốc (theo ID)

mysql> select * from DemoTable1557;
+-----------+-------------+
| SubjectId | SubjectName |
+-----------+-------------+
|         1 | MySQL       |
|         2 | MongoDB     |
|         3 | Java        |
|         4 | C           |
+-----------+-------------+
4 rows in set (0.00 sec)

3. Xáo trộn thứ tự

mysql> select * from DemoTable1557 order by rand();

4. Kết quả (ví dụ một lần chạy)

+-----------+-------------+
| SubjectId | SubjectName |
+-----------+-------------+
|         1 | MySQL       |
|         3 | Java        |
|         2 | MongoDB     |
|         4 | C           |
+-----------+-------------+
4 rows in set (0.00 sec)

Ứng dụng: Hiển thị quảng cáo ngẫu nhiên, quiz câu hỏi trắc nghiệm, A/B testing.

⚠️ Cảnh báo hiệu suất: ORDER BY RAND() yêu cầu MySQL tạo bảng tạm, gán số ngẫu nhiên cho mỗi hàng, sắp xếp → O(N log N). Rất chậm trên bảng > 10.000 hàng.

Giải pháp thay thế cho bảng lớn:

-- Lấy 1 hàng ngẫu nhiên nhanh
SELECT * FROM table 
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM table))) 
LIMIT 1;

-- Lấy N hàng (có thể không đều)
SELECT * FROM table 
WHERE RAND() < 0.01  -- 1% xác suất
LIMIT 10;