Pengoptimuman Fungsi MySQL ORDER BY RAND()
Pengenalan
Penggunaan Fungsi ORDER BY RAND() dalam MySQL boleh mengakibatkan prestasi pertanyaan yang perlahan, terutamanya dalam keadaan yang kurang dioptimumkan meja. Artikel ini menyelidiki teknik yang cekap untuk mengoptimumkan pertanyaan sedemikian dan menyediakan penyelesaian praktikal untuk menyelesaikan isu ini.
Teknik Pengoptimuman
Satu penyelesaian berkesan melibatkan penggunaan subkueri yang digabungkan dengan STRAIGHT_JOIN, seperti yang 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 terbukti sangat berkesan untuk jadual MyISAM disebabkan oleh sifat serta-merta operasi COUNT(*). Untuk jadual InnoDB, ia kekal jauh lebih pantas daripada ORDER BY RAND().
Dalam kes di mana hanya satu rekod rawak diperlukan, pendekatan berbeza 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 ) )
Kaedah ini menganggap taburan nilai ac_id yang agak sekata.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() untuk Prestasi Pertanyaan yang Lebih Pantas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!