Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Meningkatkan Prestasi ORDER MySQL BY RAND() untuk Set Data Besar?

Bagaimana untuk Meningkatkan Prestasi ORDER MySQL BY RAND() untuk Set Data Besar?

Mary-Kate Olsen
Lepaskan: 2024-12-18 08:11:14
asal
349 orang telah melayarinya

How to Improve MySQL's ORDER BY RAND() Performance for Large Datasets?

Cara Meningkatkan ORDER MySQL BY RAND() Prestasi

Fungsi ORDER BY RAND() dalam MySQL boleh terbukti tidak cekap untuk dataset yang besar, membawa kepada pelaksanaan pertanyaan yang perlahan. Untuk menangani isu ini, adalah penting untuk menyelami log pertanyaan lambat MySQL untuk mendapatkan cerapan.

Ketidakcekapan dengan ORDER BY RAND()

Pertanyaan yang mengandungi ORDER BY RAND() selalunya menguasai log pertanyaan perlahan. Penyelesaian yang dicadangkan yang disediakan oleh MySQLPerformanceBlog mungkin mencukupi dalam keadaan tertentu. Walau bagaimanapun, jadual yang tidak dioptimumkan atau diuruskan oleh pengguna memberikan cabaran yang memerlukan langkah yang lebih berkesan.

Penyelesaian: Mengelakkan Isih

Penyelesaian yang paling optimum terletak pada mengelakkan pengisihan sama sekali. Kita boleh mencapai ini dengan menggunakan teknik yang mengira kebarangkalian pemilihan baris. Berikut ialah pertanyaan yang memanfaatkan pendekatan ini:

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

Teknik ini sangat cekap dalam pangkalan data MyISAM dan menyediakan peningkatan prestasi yang ketara dalam InnoDB juga.

Memilih Rekod Rawak Tunggal

Untuk senario yang melibatkan pemilihan rekod rawak tunggal, pertimbangkan perkara berikut pertanyaan:

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.

Atas ialah kandungan terperinci Bagaimana untuk Meningkatkan Prestasi ORDER MySQL BY RAND() untuk Set Data Besar?. 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