Bạn nói đúng, nó sẽ áp dụng ORDER BY sau khi giảm số hàng với WHERE, GROUP BY và HAVING. Nhưng nó sẽ áp dụng ORDER BY trước LIMIT.
Vì vậy, nếu bạn lọc số hàng xuống đủ, thì có, ORDER BY RAND () có thể đạt được những gì bạn muốn mà không có tác động lớn đến hiệu suất. Có một lợi ích hợp pháp đối với mã đơn giản và dễ đọc.
Rắc rối xảy đến khi bạn nghĩ rằng truy vấn của bạn sẽ giảm các hàng xuống một cái gì đó nhỏ, nhưng theo thời gian khi dữ liệu của bạn phát triển, số lượng hàng cần sắp xếp sẽ trở nên lớn trở lại. Vì truy vấn của bạn khi đó LIMIT 10 trên kết quả được sắp xếp sẽ ẩn thực tế là bạn đang thực hiện ORDER BY RAND () trên 500 nghìn hàng. Bạn chỉ thấy hiệu suất ngày càng kém đi một cách bí ẩn.
Tôi đã viết về các phương pháp thay thế để chọn một hàng ngẫu nhiên trong cuốn sách của tôi Phản nguyên tố SQL:Tránh Cạm bẫy của lập trình cơ sở dữ liệu hoặc trong các câu trả lời khác tại đây trên Stack Overflow:
- Chọn hàng ngẫu nhiên với MySQL
- ngẫu nhiên hóa tập dữ liệu lớn
- chọn nhanh một hàng ngẫu nhiên từ một bảng lớn trong mysql