Generator nomor pseudo-acak MySQL sepenuhnya deterministik. Dokumen mengatakan:
Itu tidak dapat menggunakan /dev/random karena MySQL dirancang untuk bekerja pada berbagai sistem operasi, beberapa di antaranya tidak memiliki /dev/random.
MySQL menginisialisasi seed default pada startup server, menggunakan integer yang dikembalikan oleh time(0)
.Jika Anda tertarik dengan baris sumber, ada di sumber MySQL di file sql/mysqld.cc, fungsi init_server_components()
. Saya tidak berpikir itu pernah menumbuhkan kembali dirinya sendiri.
Kemudian nomor "acak" berikutnya hanya didasarkan pada benih. Lihat file sumber mysys_ssl/my_rnd.cc, fungsi my_rnd()
.
Solusi praktik terbaik untuk tugas pemilihan acak Anda, untuk kinerja dan kualitas pengacakan, adalah menghasilkan nilai acak antara nilai kunci primer minimum dan nilai kunci primer maksimum. Kemudian gunakan nilai acak itu untuk memilih kunci utama di tabel Anda:
SELECT ... FROM MyTable WHERE id > $random LIMIT 1
Alasan Anda menggunakan> alih-alih =adalah karena Anda mungkin memiliki celah di id karena baris dihapus atau dibatalkan, atau Anda mungkin memiliki kondisi lain di klausa WHERE Anda sehingga Anda memiliki celah di antara baris yang cocok dengan kondisi Anda .
Kerugian dari metode lebih besar dari ini:
- Baris yang mengikuti celah seperti itu memiliki peluang lebih tinggi untuk dipilih, dan semakin besar celah, semakin besar peluangnya.
- Anda perlu mengetahui MIN(id) dan MAX(id) sebelum menghasilkan nilai acak.
- Tidak berfungsi dengan baik jika Anda membutuhkan lebih dari satu baris acak.
Keuntungan dari metode ini:
- Ini jauh lebih cepat daripada ORDER BY RAND(), bahkan untuk ukuran tabel yang sederhana.
- Anda dapat menggunakan fungsi acak di luar SQL.