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

MySQL RAND () nó có thể được sử dụng bao lâu một lần? nó có sử dụng / dev / random không?

Trình tạo số giả ngẫu nhiên MySQL hoàn toàn xác định. Tài liệu nói:

Nó không thể sử dụng / dev / random vì MySQL được thiết kế để hoạt động trên nhiều hệ điều hành khác nhau, một số trong số đó không có / dev / random.

MySQL khởi tạo một hạt giống mặc định khi khởi động máy chủ, sử dụng số nguyên được trả về bởi time(0) .Nếu bạn quan tâm đến dòng nguồn, thì nó nằm trong nguồn MySQL trong tệp sql / mysqld.cc, function init_server_components() . Tôi không nghĩ nó sẽ tự gieo mầm lại.

Sau đó, các số "ngẫu nhiên" tiếp theo chỉ dựa trên hạt giống. Xem tệp nguồn mysys_ssl / my_rnd.cc, function my_rnd() .

Giải pháp thực tiễn tốt nhất cho nhiệm vụ chọn ngẫu nhiên của bạn, cho cả hiệu suất và chất lượng của ngẫu nhiên, là tạo một giá trị ngẫu nhiên giữa giá trị khóa chính tối thiểu và giá trị khóa chính tối đa. Sau đó, sử dụng giá trị ngẫu nhiên đó để chọn khóa chính trong bảng của bạn:

SELECT ... FROM MyTable WHERE id > $random LIMIT 1

Lý do bạn sử dụng> thay vì =là bạn có thể có khoảng trống trong id do các hàng bị xóa hoặc cuộn lại hoặc bạn có thể có các điều kiện khác trong mệnh đề WHERE của mình để bạn có khoảng trống giữa các hàng phù hợp với điều kiện của bạn .

Nhược điểm của phương pháp lớn hơn này:

  • Các hàng theo sau khoảng cách như vậy có cơ hội được chọn cao hơn và khoảng cách càng lớn thì cơ hội càng lớn.
  • Bạn cần biết MIN (id) và MAX (id) trước khi tạo giá trị ngẫu nhiên.
  • Không hoạt động tốt nếu bạn cần nhiều hơn một hàng ngẫu nhiên.

Ưu điểm của phương pháp này:

  • Nó nhanh hơn nhiều so với ORDER BY RAND (), ngay cả đối với kích thước bảng khiêm tốn.
  • Bạn có thể sử dụng một hàm ngẫu nhiên bên ngoài SQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để ngăn truy vấn này in hai lần cùng một kết quả?

  2. Cách cài đặt MySQL trên Debian 8

  3. UnsupportedOperationException với DriverManager.getConnection () trên Android

  4. Java:Chèn nhiều hàng vào MySQL với PreparedStatement

  5. varchar so với văn bản - MySQL