Lý do đặt hàng theo RAND()
có thể chậm là bạn đang buộc cơ sở dữ liệu thực sự sắp xếp toàn bộ bảng trước khi trả về bất kỳ thứ gì. Chỉ cần giảm tải xuống một lần quét bảng sẽ nhanh hơn nhiều (mặc dù vẫn hơi chậm).
Điều này có nghĩa là bạn có thể đi được một phần con đường chỉ bằng cách tránh việc đặt hàng:
SELECT *
FROM my_table
WHERE RAND() < 0.1
ORDER BY RAND()
LIMIT 100
Thao tác này sẽ chọn khoảng 1% tất cả các hàng trong bảng, sắp xếp chúng và trả về 100 hàng đầu. Chỉ cần lưu ý rằng vấn đề chính ở đây (cũng như với câu trả lời của @ cmd) là bạn không thể chắc chắn rằng truy vấn trả về bất cứ thứ gì.
Cách tiếp cận ở trên sẽ bao gồm việc quét toàn bộ bảng (để quyết định những hàng nào sẽ sử dụng) sau đó là sắp xếp khoảng 1% số hàng. Nếu bạn có nhiều hàng, bạn có thể giảm tỷ lệ phần trăm cho phù hợp.