Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Dapatkan Berbilang Baris Rawak dengan Cekap daripada MySQL tanpa Menggunakan ORDER BY RAND()?

Bagaimanakah Saya Boleh Dapatkan Berbilang Baris Rawak dengan Cekap daripada MySQL tanpa Menggunakan ORDER BY RAND()?

Susan Sarandon
Susan Sarandonasal
2025-01-21 03:21:10682semak imbas

How Can I Efficiently Retrieve Multiple Random Rows from MySQL without Using ORDER BY RAND()?

MySQL: Pensampelan rawak throughput tinggi melebihi ORDER BY RAND()

Teroka alternatif untuk mendapatkan berbilang hasil rawak

Walaupun fungsi ORDER BY RAND() MySQL menyediakan kaedah untuk mendapatkan hasil rawak secara langsung, ia tidak dapat memilih berbilang baris data rawak dengan cekap. Artikel ini meneroka teknik alternatif untuk mengoptimumkan pertanyaan sedemikian.

Penyelesaian pengoptimuman: menggunakan lajur indeks dan subquery

Untuk pertanyaan mencari hasil rawak, pengoptimuman prestasi adalah penting. Satu pendekatan inovatif yang berfungsi dengan baik ialah menggunakan gabungan lajur dan subkueri yang diindeks. Teknik ini mengurangkan overhed pemprosesan dengan ketara dengan mengasingkan proses rawak kepada keadaan tertentu.

Langkah:

  1. Tentukan peratusan keputusan untuk rawak: Takrifkan bilangan keputusan untuk rawak sebagai peratusan daripada jumlah baris.
  2. Buat subkueri: Gunakan fungsi RAND() dan klausa LIMIT untuk memilih ID baris yang memenuhi peratusan yang ditentukan.
  3. Sertai subkueri: Gunakan cantum untuk menggabungkan subkueri dengan jadual utama, menggunakan lajur indeks sebagai kunci cantum.
  4. Dapatkan hasil penuh: Dapatkan semula lajur yang diperlukan daripada jadual utama menggunakan baris yang dikenal pasti oleh subkueri.

Contoh:

Pertimbangkan pertanyaan berikut:

<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>

Pertanyaan dioptimumkan:

<code class="language-sql">SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id</code>

Kelebihan:

  • Pengoptimuman kelajuan pelaksanaan, jauh lebih pantas daripada PESANAN OLEH RAND()
  • Meningkatkan kebolehskalaan untuk set data yang besar
  • Digunakan pada mana-mana jadual dengan lajur diindeks

Nota:

Kaedah pengoptimuman ini bergantung pada ketekalan antara subkueri dan pertanyaan utama untuk memastikan ia mengembalikan hasil yang tepat. Selain itu, memilih had yang munasabah untuk peratusan hasil rawak boleh membantu mengekalkan prestasi.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Dapatkan Berbilang Baris Rawak dengan Cekap daripada MySQL tanpa Menggunakan ORDER BY RAND()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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