Pengoptimuman Pesanan MySQL RAND()
Pertanyaan perlahan yang menampilkan ORDER BY RAND() memberikan cabaran prestasi.
Masalahnya
Pertanyaan dengan PESANAN BY RAND() selalunya menghasilkan prestasi suboptimum, terutamanya pada jadual besar atau kerap dikemas kini. Penyelesaian MySQL (MySQLPerformanceBlog) mungkin tidak mencukupi.
Penyelesaian
Untuk mengoptimumkan pesanan RAND(), pertimbangkan pendekatan berikut:
SELECT * FROM ( SELECT @cnt := COUNT(*) + 1, @lim := 10 FROM t_random ) vars STRAIGHT_JOIN ( SELECT r.*, @lim := @lim - 1 FROM t_random r WHERE (@cnt := @cnt - 1) AND RAND(20090301) < @lim / @cnt ) i
Pendekatan ini mengelak pengisihan dengan mengekalkan kebarangkalian berjalan semasa mengulang data, menjadikannya lebih cekap daripada ORDER BY RAND().
Untuk Pemilihan Baris Tunggal
Untuk memilih satu baris rawak, cuba pertanyaan ini:
SELECT aco.* FROM ( SELECT minid + FLOOR((maxid - minid) * RAND()) AS randid FROM ( SELECT MAX(ac_id) AS maxid, MIN(ac_id) AS minid FROM accomodation ) q ) q2 JOIN accomodation aco ON aco.ac_id = COALESCE ( ( SELECT accomodation.ac_id FROM accomodation WHERE ac_id > randid AND ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECT NULL FROM accomodation_category WHERE acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ), ( SELECT accomodation.ac_id FROM accomodation WHERE ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECT NULL FROM accomodation_category WHERE acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ) )
Pengoptimuman ini menganggap bahawa ac_id diedarkan secara relatifnya sama rata.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan MySQL Menggunakan ORDER BY RAND()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!