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

MySQL:Алтернативи за ПОРЪЧВАНЕ ПО RAND()

АКТУАЛИЗИРАНЕ 2016

Това решение работи най-добре при използване на индексирана колона .

Ето прост пример за оптимизиран тест за заявки, отбелязан със 100 000 реда.

ОПТИМИЗИРАН:300 мс

SELECT 
    g.*
FROM
    table g
        JOIN
    (SELECT 
        id
    FROM
        table
    WHERE
        RAND() < (SELECT 
                ((4 / COUNT(*)) * 10)
            FROM
                table)
    ORDER BY RAND()
    LIMIT 4) AS z ON z.id= g.id

забележка относно лимита :ограничение 4 и 4/брой(*). 4-те трябва да са едно и също число. Промяната на броя, които връщате, не влияе толкова на скоростта. Бенчмарк при лимит 4 и лимит 1000 са еднакви. Лимитът от 10 000 го докара до 600 ms

бележка за присъединяване :Рандомизирането само на идентификатора е по-бързо от рандомизирането на цял ред. Тъй като трябва да копира целия ред в паметта, след това го рандомизирайте. Обединяването може да бъде всяка таблица, която е свързана с подзаявката Its за предотвратяване на сканиране на таблици.

забележете клауза къде :Броят където ограничава количеството резултати, които се рандомизират. Той отнема процент от резултатите и ги сортира, а не цялата таблица.

забележете подзаявка :Ако правите присъединява и допълнителни условия where трябва да ги поставите както в подзаявката, така и в подзаявката. За да имате точно преброяване и изтегляне на правилните данни.

НЕОПТИМИЗИРАН:1200 мс

SELECT 
    g.*
FROM
    table g
ORDER BY RAND()
LIMIT 4

ПРЕДИМСТВА

4 пъти по-бързо от order by rand() . Това решение може да работи с всяка таблица с индексирана колона.

ПРОТИВ

Това е малко сложно със сложни заявки. Трябва да поддържате 2 кодови бази в подзаявките



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дублиране, копиране или архивиране на таблици в MySQL, MariaDB, Oracle, PostgreSQL, DB2 и SQLite със Създаване на таблица като SQL

  2. Нулирайте Root паролата на MySQL в Windows

  3. Как да получите времето от низ в MySQL

  4. задаване на глобален sql_mode в mysql

  5. Как да синхронизирам повторно Mysql DB, ако главен и подчинен имат различен корпус на база данни на Mysql репликация?