sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg optimere MySQL's ORDER BY RAND() funktion?

Prøv dette:

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

Dette er især effektivt på MyISAM (siden COUNT(*) er øjeblikkelig), men endda i InnoDB det er 10 gange mere effektiv end ORDER BY RAND() .

Hovedideen her er, at vi ikke sorterer, men i stedet beholder to variable og beregner running probability af en række, der skal vælges på det aktuelle trin.

Se denne artikel i min blog for flere detaljer:

Opdatering:

Hvis du kun skal vælge en enkelt tilfældig post, prøv denne:

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

Dette forudsætter din ac_id 's er fordelt mere eller mindre jævnt.



  1. Understøtter Oracle fuldtekstsøgning?

  2. Bedre samtidighed i Oracle end SQL Server?

  3. postgresql - antal (ingen null-værdier) af hver kolonne i en tabel

  4. ORA-06502:PL/SQL:numerisk eller værdifejl:tegnstrengbuffer for lille