Cara Meningkatkan ORDER MySQL BY RAND() Prestasi
Fungsi ORDER BY RAND() dalam MySQL boleh terbukti tidak cekap untuk dataset yang besar, membawa kepada pelaksanaan pertanyaan yang perlahan. Untuk menangani isu ini, adalah penting untuk menyelami log pertanyaan lambat MySQL untuk mendapatkan cerapan.
Ketidakcekapan dengan ORDER BY RAND()
Pertanyaan yang mengandungi ORDER BY RAND() selalunya menguasai log pertanyaan perlahan. Penyelesaian yang dicadangkan yang disediakan oleh MySQLPerformanceBlog mungkin mencukupi dalam keadaan tertentu. Walau bagaimanapun, jadual yang tidak dioptimumkan atau diuruskan oleh pengguna memberikan cabaran yang memerlukan langkah yang lebih berkesan.
Penyelesaian: Mengelakkan Isih
Penyelesaian yang paling optimum terletak pada mengelakkan pengisihan sama sekali. Kita boleh mencapai ini dengan menggunakan teknik yang mengira kebarangkalian pemilihan baris. Berikut ialah pertanyaan yang memanfaatkan pendekatan ini:
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
Teknik ini sangat cekap dalam pangkalan data MyISAM dan menyediakan peningkatan prestasi yang ketara dalam InnoDB juga.
Memilih Rekod Rawak Tunggal
Untuk senario yang melibatkan pemilihan rekod rawak tunggal, pertimbangkan perkara berikut pertanyaan:
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.
Atas ialah kandungan terperinci Bagaimana untuk Meningkatkan Prestasi ORDER MySQL BY RAND() untuk Set Data Besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!