Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() Fungsi untuk Pemilihan Baris Rawak Lebih Pantas?

Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() Fungsi untuk Pemilihan Baris Rawak Lebih Pantas?

Linda Hamilton
Lepaskan: 2024-12-19 22:40:15
asal
583 orang telah melayarinya

How Can I Optimize MySQL's ORDER BY RAND() Function for Faster Random Row Selection?

Mengoptimumkan Fungsi MySQL ORDER BY RAND() untuk Pemilihan Baris Rawak Lebih Pantas

Fungsi MySQL ORDER BY RAND() digunakan secara meluas untuk memilih rawak baris daripada jadual. Walau bagaimanapun, ia boleh menjadi tidak cekap, terutamanya untuk jadual besar atau kemas kini yang kerap. Ketidakcekapan ini terbukti dalam log pertanyaan perlahan, di mana pertanyaan yang mengandungi ORDER BY RAND() menyumbang dengan ketara kepada kelembapan.

Satu penyelesaian yang berpotensi ialah kaedah MySQLPerformanceBlog, yang melibatkan pembahagian pertanyaan kepada berbilang subquery. Walau bagaimanapun, teknik ini mungkin tidak mencukupi dalam semua situasi.

Pendekatan Alternatif

Pendekatan alternatif yang memberikan kecekapan yang lebih baik 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
Salin selepas log masuk

Kaedah ini beroperasi dengan mengira kebarangkalian berjalan setiap baris dipilih berdasarkan dua pembolehubah. Dengan menggunakan STRAIGHT_JOIN, susunan baris dalam hasilnya dikekalkan, dengan berkesan menyediakan pilihan rawak.

Kes Khusus: Memilih Rekod Rawak Tunggal

Jika keperluan adalah untuk memilih satu rekod rawak, pertanyaan berikut 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
        )
        )
Salin selepas log masuk

Pertanyaan ini menganggap taburan nilai ac_id yang sekata.

Dengan menggunakan pendekatan alternatif ini, anda boleh meningkatkan dengan ketara prestasi pertanyaan MySQL yang melibatkan fungsi ORDER BY RAND().

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() Fungsi untuk Pemilihan Baris Rawak Lebih Pantas?. 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