Cách đơn giản nhất lấy 1 (hoặc N) bản ghi ngẫu nhiên: ORDER BY RAND() LIMIT N.
Ví dụ minh họa
Tạo bảng 5 học sinh:
CREATE TABLE DemoTable1581 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(20)
);
INSERT INTO DemoTable1581 (StudentName) VALUES ('Chris'),('Bob'),('Sam'),('Mike'),('Carol');
Lấy 1 bản ghi ngẫu nhiên:
SELECT * FROM DemoTable1581 ORDER BY RAND() LIMIT 1;
Kết quả (ví dụ)
| StudentId | StudentName |
|---|---|
| 4 | Mike |
⚠️ Vấn đề hiệu năng nghiêm trọng
RAND()được tính cho mọi hàng trong bảng.- MySQL phải tạo temporary table, sort toàn bộ → O(N log N).
- Bảng > 10k hàng: rất chậm. Bảng > 1M: có thể timeout.
Các giải pháp thay thế hiệu quả hơn
1. Random ID trong phạm vi (cần ID liên tục, ít xóa)
SELECT * FROM DemoTable1581 WHERE StudentId >= (SELECT FLOOR(RAND() * (SELECT MAX(StudentId) FROM DemoTable1581))) ORDER BY StudentId LIMIT 1;
2. 2 bước: Lấy COUNT, rồi OFFSET ngẫu nhiên (application level)
-- Bước 1: SELECT COUNT(*) FROM DemoTable1581; -- Giả sử = 10000 -- Bước 2: App random offset = 4231 -- Bước 3: SELECT * FROM DemoTable1581 LIMIT 1 OFFSET 4231;
3. Bảng lớn: TABLESAMPLE (MySQL 8.0.23+ không hỗ trợ, PostgreSQL có)
MySQL chưa hỗ trợ TABLESAMPLE.
Khuyên dùng
- Bảng nhỏ (< 1000 hàng):
ORDER BY RAND() LIMIT 1OK. - Bảng trung bình: Cách 1 (random ID) nếu ID dày đặc.
- Bảng lớn: Cách 2 (COUNT + OFFSET) ở tầng ứng dụng.
- Cần random có trọng số: Thêm cột
weight, dùng thuật toán weighted random.