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

Lấy dữ liệu ngẫu nhiên từ cơ sở dữ liệu MySQL nhưng không lặp lại dữ liệu

Việc chọn các hàng ngẫu nhiên luôn khó và không có giải pháp hoàn hảo nào mà không cần đến một số thỏa hiệp. Làm tổn hại đến hiệu suất, hoặc thỏa hiệp ngay cả phân phối ngẫu nhiên, hoặc thỏa hiệp về cơ hội chọn các bản sao, v.v.

Như @JakeGould đã đề cập, bất kỳ giải pháp nào với ORDER BY RAND() không mở rộng quy mô tốt. Khi số lượng hàng trong bảng của bạn lớn hơn, chi phí sắp xếp toàn bộ bảng trong một sắp xếp tệp ngày càng trở nên tồi tệ hơn. Jake đúng là không thể lưu truy vấn vào bộ nhớ đệm khi thứ tự sắp xếp là ngẫu nhiên. Nhưng tôi không quan tâm đến điều đó lắm vì dù sao thì tôi cũng thường vô hiệu hóa bộ đệm truy vấn (nó có vấn đề về khả năng mở rộng riêng).

Đây là một giải pháp để ngẫu nhiên hóa trước các hàng trong bảng, bằng cách tạo cột rownum và gán các giá trị liên tiếp duy nhất:

ALTER TABLE products ADD COLUMN rownum INT UNSIGNED, ADD KEY (rownum);
SET @rownum := 0;
UPDATE products SET rownum = (@rownum:[email protected]+1) ORDER BY RAND();

Giờ đây, bạn có thể lấy một hàng ngẫu nhiên bằng cách tra cứu chỉ mục, không có sắp xếp:

SELECT * FROM products WHERE rownum = 1;

Hoặc bạn có thể nhận hàng ngẫu nhiên tiếp theo:

SELECT * FROM products WHERE rownum = 2;

Hoặc bạn có thể nhận 10 hàng ngẫu nhiên cùng một lúc hoặc bất kỳ số nào khác mà bạn muốn, không trùng lặp:

SELECT * FROM products WHERE rownum BETWEEN 11 and 20;

Bạn có thể sắp xếp lại ngẫu nhiên bất cứ lúc nào bạn muốn:

SET @rownum := 0;
UPDATE products SET rownum = (@rownum:[email protected]+1) ORDER BY RAND();

Vẫn tốn kém để thực hiện việc sắp xếp ngẫu nhiên, nhưng bây giờ bạn không phải thực hiện việc đó trên mọi truy vấn CHỌN. Bạn có thể làm việc đó theo lịch trình, hy vọng vào thời gian thấp điểm.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm kiếm lời khuyên về truy vấn video có liên quan trên hệ thống video được gắn thẻ

  2. Nhận tất cả dữ liệu POST và gửi trong email

  3. PHP &MySQL:Làm cách nào để sử dụng SET @ rank =0; trong $ query =

  4. Làm cách nào để tôi có thể sử dụng mySQL Replace () để thay thế các chuỗi trong nhiều bản ghi?

  5. Biến do người dùng xác định là bí danh MySQL v8.0 không hoạt động