Mengoptimumkan Fungsi MySQL ORDER BY RAND() untuk Pemilihan Baris Rawak Lebih Pantas
Fungsi MySQL ORDER BY RAND() digunakan secara meluas untuk memilih rawak baris daripada jadual. Walau bagaimanapun, ia boleh menjadi tidak cekap, terutamanya untuk jadual besar atau kemas kini yang kerap. Ketidakcekapan ini terbukti dalam log pertanyaan perlahan, di mana pertanyaan yang mengandungi ORDER BY RAND() menyumbang dengan ketara kepada kelembapan.
Satu penyelesaian yang berpotensi ialah kaedah MySQLPerformanceBlog, yang melibatkan pembahagian pertanyaan kepada berbilang subquery. Walau bagaimanapun, teknik ini mungkin tidak mencukupi dalam semua situasi.
Pendekatan Alternatif
Pendekatan alternatif yang memberikan kecekapan yang lebih baik ditunjukkan di bawah:
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
Kaedah ini beroperasi dengan mengira kebarangkalian berjalan setiap baris dipilih berdasarkan dua pembolehubah. Dengan menggunakan STRAIGHT_JOIN, susunan baris dalam hasilnya dikekalkan, dengan berkesan menyediakan pilihan rawak.
Kes Khusus: Memilih Rekod Rawak Tunggal
Jika keperluan adalah untuk memilih satu rekod rawak, pertanyaan berikut boleh digunakan:
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 ) )
Pertanyaan ini menganggap taburan nilai ac_id yang sekata.
Dengan menggunakan pendekatan alternatif ini, anda boleh meningkatkan dengan ketara prestasi pertanyaan MySQL yang melibatkan fungsi ORDER BY RAND().
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() Fungsi untuk Pemilihan Baris Rawak Lebih Pantas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!