PERBARUI 2016
Solusi ini bekerja paling baik menggunakan kolom terindeks .
Berikut adalah contoh sederhana dan bangku kueri yang dioptimalkan yang ditandai dengan 100.000 baris.
DIOPTIMALKAN:300 md
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
catatan tentang jumlah batas :batas 4 dan 4/hitungan(*). 4s harus nomor yang sama. Mengubah berapa banyak Anda kembali tidak terlalu mempengaruhi kecepatan. Benchmark pada limit 4 dan limit 1000 adalah sama. Batas 10.000 membawanya hingga 600 md
catatan tentang bergabung :Mengacak hanya id lebih cepat daripada mengacak seluruh baris. Karena harus menyalin seluruh baris ke dalam memori kemudian mengacaknya. Gabung dapat berupa tabel apa pun yang ditautkan ke subquery Its untuk mencegah tabel.
perhatikan di mana klausa :Hitungan mana membatasi jumlah hasil yang diacak. Dibutuhkan persentase dari hasil dan mengurutkannya daripada seluruh tabel.
sub kueri catatan :Jika melakukan bergabung dan ekstra di mana kondisi klausa Anda harus menempatkan keduanya di subquery dan subsubquery. Untuk mendapatkan penghitungan yang akurat dan menarik kembali data yang benar.
TIDAK DIOPTIMALKAN:1200 md
SELECT
g.*
FROM
table g
ORDER BY RAND()
LIMIT 4
PRO
4x lebih cepat dari order by rand()
. Solusi ini dapat bekerja dengan tabel apa pun dengan kolom terindeks.
KONTRA
Ini agak rumit dengan pertanyaan yang kompleks. Perlu memelihara 2 basis kode di subkueri