Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Dapatkan Berbilang Hasil Rawak Secara Cekap daripada Pangkalan Data tanpa Menggunakan `PESANAN OLEH RAND()`?

Bagaimanakah Saya Boleh Dapatkan Berbilang Hasil Rawak Secara Cekap daripada Pangkalan Data tanpa Menggunakan `PESANAN OLEH RAND()`?

Mary-Kate Olsen
Lepaskan: 2025-01-21 03:36:08
asal
271 orang telah melayarinya

How Can I Efficiently Retrieve Multiple Random Results from a Database without Using `ORDER BY RAND()`?

Mengelakkan Kesesakan Prestasi dengan Pengambilan Data Rawak dalam MySQL

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Penjelasan Pengoptimuman

Pertanyaan yang disemak ini menggabungkan beberapa penambahbaikan utama:

  • Penggunaan Lajur Berindeks: Subkueri menapis baris menggunakan RAND() terhadap peratusan daripada jumlah baris. Mengindeks lajur id (atau mana-mana lajur yang digunakan dalam klausa WHERE) membolehkan pengecaman baris pantas.
  • ID Rawak Sahaja: Rawak digunakan hanya pada ID, meminimumkan penggunaan memori dan meningkatkan prestasi.
  • Had Konsisten: Klausa LIMIT dalam kedua-dua subkueri (4) dan pertanyaan keseluruhan mestilah sama.
  • Subkueri Ditapis: Subkueri tersebut menggabungkan syarat 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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan