Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan MySQL Menggunakan ORDER BY RAND()?

Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan MySQL Menggunakan ORDER BY RAND()?

Linda Hamilton
Lepaskan: 2024-12-14 02:38:14
asal
602 orang telah melayarinya

How Can I Optimize MySQL Queries Using ORDER BY RAND()?

Pengoptimuman Pesanan MySQL RAND()

Pertanyaan perlahan yang menampilkan ORDER BY RAND() memberikan cabaran prestasi.

Masalahnya

Pertanyaan dengan PESANAN BY RAND() selalunya menghasilkan prestasi suboptimum, terutamanya pada jadual besar atau kerap dikemas kini. Penyelesaian MySQL (MySQLPerformanceBlog) mungkin tidak mencukupi.

Penyelesaian

Untuk mengoptimumkan pesanan RAND(), pertimbangkan pendekatan berikut:

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

Pendekatan ini mengelak pengisihan dengan mengekalkan kebarangkalian berjalan semasa mengulang data, menjadikannya lebih cekap daripada ORDER BY RAND().

Untuk Pemilihan Baris Tunggal

Untuk memilih satu baris rawak, cuba pertanyaan ini:

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

Pengoptimuman ini menganggap bahawa ac_id diedarkan secara relatifnya sama rata.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan MySQL Menggunakan ORDER BY 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