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

Chọn bản ghi ngẫu nhiên trong MySQL với ORDER BY RAND()

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ụ)

StudentIdStudentName
4Mike

⚠️ 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 1 OK.
  • 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.