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

Tối ưu hóa truy vấn ORDER BY RAND () chậm

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 ().




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL hoán đổi giá trị khóa chính

  2. Viết một truy vấn chọn để nhận giá trị bảng bằng cách sử dụng một giá trị trường bảng khác

  3. INNER THAM GIA mysql

  4. truy vấn mysql - sự cố chèn dữ liệu unix_timestamp (now ())

  5. Làm cách nào để kết hợp LIKE với IN trong một truy vấn MYSQL?