Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да оптимизирам функцията ORDER BY RAND() на MySQL?

Опитайте това:

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

Това е особено ефективно за MyISAM (тъй като COUNT(*) е моментално), но дори и в InnoDB това е 10 пъти по-ефективен от ORDER BY RAND() .

Основната идея тук е, че ние не сортираме, а вместо това запазваме две променливи и изчисляваме running probability от ред, който да бъде избран на текущата стъпка.

Вижте тази статия в моя блог за повече подробности:

Актуализация:

Ако трябва да изберете само един произволен запис, опитайте това:

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

Това предполага вашия ac_id 's са разпределени повече или по-малко равномерно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Бързо изградете PHP CRUD интерфейс с PDO Advanced CRUD Generator Tool

  2. MySQL:Голям VARCHAR срещу TEXT?

  3. Как да изчислим общите продажби на месец в MySQL?

  4. Как да зададете набора от символи и съпоставяне на база данни в MySQL

  5. Активирайте регистрирането на бавни заявки (Slow Query Log) в MySQL база данни