MySQL ORDER BY RAND()
ialah cara mudah untuk mendapatkan entri pangkalan data rawak. Walau bagaimanapun, mendapatkan berbilang baris rawak menggunakan kaedah ini menjadi sangat perlahan, terutamanya dengan set data yang besar.
Pertimbangkan pertanyaan ini bertujuan untuk memilih 18 profil pengguna rawak:
<code class="language-sql">SELECT u.id, p.photo FROM users u, profiles p WHERE p.memberid = u.id AND p.photo != '' AND (u.ownership=1 OR u.stamp=1) ORDER BY RAND() LIMIT 18</code>
Ketidakcekapan berpunca daripada keperluan sedia ada ORDER BY RAND()
untuk mengisih keseluruhan set hasil sebelum menggunakan klausa LIMIT
.
Pendekatan Lebih Cekap
Strategi unggul menggunakan lajur diindeks untuk mempercepatkan pemilihan rawak secara mendadak. Berikut ialah pertanyaan yang dioptimumkan:
<code class="language-sql">SELECT g.* FROM table g JOIN (SELECT id FROM table WHERE RAND() < (SELECT 4 / COUNT(*) ) * 10 LIMIT 4) AS subquery ON g.id = subquery.id;</code>
Penjelasan Pengoptimuman
Pertanyaan yang disemak ini menggabungkan beberapa penambahbaikan utama:
RAND()
terhadap peratusan daripada jumlah baris. Mengindeks lajur id
(atau mana-mana lajur yang digunakan dalam klausa WHERE
) membolehkan pengecaman baris pantas.LIMIT
dalam kedua-dua subkueri (4) dan pertanyaan keseluruhan mestilah sama.WHERE
yang sama sebagai pertanyaan utama, memastikan integriti data.Kaedah ini mengurangkan masa pelaksanaan pertanyaan dengan ketara, walaupun dengan jadual besar, memberikan penyelesaian yang lebih berskala untuk mendapatkan semula berbilang hasil rawak.
Kesimpulan
Teknik pengoptimuman ini menawarkan peningkatan prestasi yang ketara apabila berurusan dengan pemilihan data rawak dalam MySQL. Dengan mengelakkan ORDER BY RAND()
, anda boleh mencipta aplikasi pangkalan data yang lebih cekap dan mantap.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Dapatkan Berbilang Hasil Rawak Secara Cekap daripada Pangkalan Data tanpa Menggunakan `PESANAN OLEH RAND()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!