CẬP NHẬT 2016
Giải pháp này hoạt động tốt nhất bằng cách sử dụng cột được lập chỉ mục .
Dưới đây là một ví dụ đơn giản về băng ghế dự bị truy vấn được tối ưu hóa được đánh dấu bằng 100.000 hàng.
TỐI ƯU: 300ms
SELECT
g.*
FROM
table g
JOIN
(SELECT
id
FROM
table
WHERE
RAND() < (SELECT
((4 / COUNT(*)) * 10)
FROM
table)
ORDER BY RAND()
LIMIT 4) AS z ON z.id= g.id
lưu ý về số tiền giới hạn :giới hạn 4 và 4 / đếm (*). 4s cần phải là cùng một số. Thay đổi số lượng bạn trả về không ảnh hưởng nhiều đến tốc độ. Điểm chuẩn ở giới hạn 4 và giới hạn 1000 là như nhau. Giới hạn 10.000 lên đến 600 mili giây
lưu ý về việc tham gia :Chỉ ngẫu nhiên id sẽ nhanh hơn ngẫu nhiên toàn bộ hàng. Vì nó phải sao chép toàn bộ hàng vào bộ nhớ sau đó ngẫu nhiên hóa nó. Tham gia có thể là bất kỳ bảng nào được liên kết với truy vấn con Nó để ngăn chặn việc quét bảng.
lưu ý mệnh đề where :Nơi đếm giới hạn số lượng kết quả đang được ngẫu nhiên hóa. Nó sử dụng một tỷ lệ phần trăm kết quả và sắp xếp chúng thay vì toàn bộ bảng.
ghi chú truy vấn phụ :Các kết nối if doing và điều kiện mệnh đề extra where bạn cần đặt chúng vào cả truy vấn con và truy vấn con. Để có một số lượng chính xác và lấy lại dữ liệu chính xác.
KHÔNG TỐI ƯU HÓA: 1200 mili giây
SELECT
g.*
FROM
table g
ORDER BY RAND()
LIMIT 4
PROS
Nhanh hơn gấp 4 lần so với order by rand()
. Giải pháp này có thể hoạt động với bất kỳ bảng nào có cột được lập chỉ mục.
CONS
Nó hơi phức tạp với các truy vấn phức tạp. Cần duy trì 2 cơ sở mã trong các truy vấn con