Mengoptimumkan ORDER MySQL BY RAND() Prestasi
Apabila mengoptimumkan pertanyaan MySQL, menangani pertanyaan perlahan yang mengandungi fungsi ORDER BY RAND() boleh mencabar. Artikel ini meneroka penyelesaian yang berkesan untuk meningkatkan prestasi pertanyaan sedemikian.
Pendekatan biasa ialah menggunakan subkueri yang mengira kedudukan setiap baris berdasarkan nilai rawak. Ini membolehkan pemilihan baris rawak yang cekap tanpa memerlukan pengisihan sebenar.
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 amat berkesan untuk jadual MyISAM, tetapi juga menawarkan peningkatan prestasi yang ketara dalam InnoDB.
Untuk memilih a rekod rawak tunggal, pendekatan alternatif 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 ) )
Pendekatan ini menganggap taburan ac_id yang agak sekata nilai. Dengan menggunakan teknik ini, anda boleh mengoptimumkan pertanyaan MySQL dengan ketara yang melibatkan ORDER BY RAND().
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() untuk Prestasi yang Lebih Baik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!