Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() untuk Prestasi yang Lebih Baik?

Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() untuk Prestasi yang Lebih Baik?

Barbara Streisand
Barbara Streisandasal
2024-12-15 22:28:11391semak imbas

How Can I Optimize MySQL's ORDER BY RAND() for Better Performance?

Mengoptimumkan ORDER MySQL BY RAND() Prestasi

Apabila mengoptimumkan pertanyaan MySQL, menangani pertanyaan perlahan yang mengandungi fungsi ORDER BY RAND() boleh mencabar. Artikel ini meneroka penyelesaian yang berkesan untuk meningkatkan prestasi pertanyaan sedemikian.

Pendekatan biasa ialah menggunakan subkueri yang mengira kedudukan setiap baris berdasarkan nilai rawak. Ini membolehkan pemilihan baris rawak yang cekap tanpa memerlukan pengisihan sebenar.

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

Kaedah ini amat berkesan untuk jadual MyISAM, tetapi juga menawarkan peningkatan prestasi yang ketara dalam InnoDB.

Untuk memilih a rekod rawak tunggal, pendekatan alternatif 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
        )
        )

Pendekatan ini menganggap taburan ac_id yang agak sekata nilai. Dengan menggunakan teknik ini, anda boleh mengoptimumkan pertanyaan MySQL dengan ketara yang melibatkan ORDER BY RAND().

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan ORDER MySQL BY RAND() untuk Prestasi yang Lebih Baik?. 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