Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak mogę zoptymalizować funkcję ORDER BY RAND() MySQL?

Spróbuj tego:

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

Jest to szczególnie skuteczne w MyISAM (ponieważ COUNT(*) jest natychmiastowa), ale nawet w InnoDB to 10 razy bardziej wydajny niż ORDER BY RAND() .

Główną ideą jest to, że nie sortujemy, ale zamiast tego zachowujemy dwie zmienne i obliczamy running probability wiersza do wybrania w bieżącym kroku.

Zobacz ten artykuł na moim blogu, aby uzyskać więcej informacji:

Aktualizacja:

Jeśli chcesz wybrać tylko jeden losowy rekord, wypróbuj to:

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

Zakłada się, że Twój ac_id są rozmieszczone mniej więcej równomiernie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę zasymulować zmienną tablicową w MySQL?

  2. Jak odwrócić kolejność znaków w ciągu znaków w MySQL

  3. WEEK() Przykłady – MySQL

  4. Jak przechowywać znak Emoji w bazie danych MySQL

  5. Funkcje matematyczne MySQL (pełna lista)