Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL:Các lựa chọn thay thế cho ORDER BY RAND ()

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tìm khi máy chủ MySQL / MariaDB được khởi động

  2. Chọn hàng ngẫu nhiên trong MySQL

  3. Tôi nên xử lý --secure-file-priv trong MySQL như thế nào?

  4. MySQL LAST_INSERT_ID () được sử dụng với nhiều bản ghi câu lệnh INSERT

  5. Khắc phục sự cố Lỗi kết hợp bất hợp pháp các đối chiếu trong mysql