sql >> Database >  >> RDS >> Mysql

MySQL:alternatieven voor ORDER BY RAND()

UPDATE 2016

Deze oplossing werkt het beste met een geïndexeerde kolom .

Hier is een eenvoudig voorbeeld van een geoptimaliseerde querybench, gemarkeerd met 100.000 rijen.

GEOPTIMALISEERD:300ms

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

opmerking over limietbedrag :limiet 4 en 4/count (*). De 4s moeten hetzelfde nummer zijn. Wijzigen hoeveel u retourneert, heeft niet zoveel invloed op de snelheid. Benchmark bij limiet 4 en limiet 1000 zijn hetzelfde. Limiet 10.000 duurde tot 600 ms

opmerking over meedoen :Het willekeurig maken van alleen de id is sneller dan het willekeurig maken van een hele rij. Omdat het de hele rij naar het geheugen moet kopiëren, moet het willekeurig worden gemaakt. De join kan elke tabel zijn die is gekoppeld aan de subquery. Het is om het scannen van tabellen te voorkomen.

let op waar clausule :De waar-telling beperkt het aantal resultaten dat wordt gerandomiseerd. Het neemt een percentage van de resultaten en sorteert ze in plaats van de hele tabel.

let op subquery :De if-doing joins en extra where-clausulevoorwaarden die u zowel in de subquery als de subsubquery moet plaatsen. Om een ​​nauwkeurige telling te hebben en correcte gegevens terug te halen.

NIET GEOPTIMALISEERD:1200ms

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

PRO'S

4x sneller dan order by rand() . Deze oplossing werkt met elke tabel met een geïndexeerde kolom.

CONS

Het is een beetje ingewikkeld met complexe vragen. Noodzaak om 2 codebases in de subquery's te behouden



  1. Hoe u Foreign Key Check in MySQL uitschakelt?

  2. Hoe UNCOMPRESSED_LENGTH() werkt in MariaDB

  3. Kolominformatie retourneren voor een opgeslagen procedure in SQL Server:sp_sproc_columns

  4. mySQL De top 5 van elke categorie teruggeven