ORDER BY RAND()
chậm vì DBMS phải đọc tất cả các hàng, sắp xếp tất cả chúng, chỉ để giữ lại một vài hàng. Vì vậy, hiệu suất của truy vấn này phụ thuộc nhiều vào số lượng hàng trong bảng và giảm khi số lượng hàng tăng lên.
Không có cách nào để tối ưu hóa điều đó.
Có những lựa chọn thay thế, tuy nhiên:
Bạn có thể triển khai "lấy 5 hàng ngẫu nhiên" bằng cách thực hiện 6 truy vấn:
- lấy số lượng hàng trong bảng (bạn có thể lưu hàng này vào bộ nhớ cache)
-
thực hiện 5 truy vấn với
OFFSET <random offset from 0 to $number_of_rows-1> LIMIT 1
(tức là chỉ đọc và trả về một hàng từ một số bù ngẫu nhiên)Ví dụ:
SELECT * FROM Products OFFSET 42 LIMIT 1
(lưu ý:hiện tại không cần tham gia)Các truy vấn như vậy rất nhanh và chạy trong thời gian hầu như không phụ thuộc vào kích thước bảng.
Cái này chắc nhiều nhanh hơn ORDER BY RAND()
.
Bây giờ, để nhận một Hình ảnh ngẫu nhiên cho mỗi Sản phẩm ngẫu nhiên:
SELECT *
FROM (
SELECT *
FROM Products
OFFSET 42 LIMIT 1
) p
JOIN ProductImages pi
ON pi.product_id = p.id
ORDER BY RAND()
LIMIT 1
Truy vấn bên trong vẫn nhanh và bên ngoài chỉ sắp xếp một vài hàng (giả sử có ít hình ảnh trên mỗi sản phẩm) và do đó, vẫn có thể sử dụng thứ tự bằng rand ().