sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Alternativ till ORDER BY RAND()

UPPDATERING 2016

Den här lösningen fungerar bäst med en indexerad kolumn .

Här är ett enkelt exempel på och optimerad frågebänk märkt med 100 000 rader.

OPTIMERAD:300 ms

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

notering om gränsbelopp :gräns 4 och 4/antal (*). 4:orna måste vara samma nummer. Att ändra hur många du returnerar påverkar inte hastigheten så mycket. Benchmark vid limit 4 och limit 1000 är samma. Limit 10 000 tog det upp till 600ms

notering om gå med :Att slumpmässigt bara slumpa fram id:t är snabbare än att slumpa en hel rad. Eftersom den måste kopiera hela raden till minnet, slumpmässiga den. Sammanfogningen kan vara vilken tabell som helst som är länkad till underfrågan Its för att förhindra tabellsökningar.

notera var klausul :Where count begränsar mängden resultat som randomiseras. Det tar en procentandel av resultaten och sorterar dem snarare än hela tabellen.

notera underfrågan :If doing joins och extra where-klausulvillkor du behöver för att sätta dem både i underfrågan och undersubfrågan. För att få en korrekt räkning och dra tillbaka korrekta data.

OOPTIMERAD:1200ms

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

PROS

4 gånger snabbare än order by rand() . Denna lösning kan fungera med alla tabeller med en indexerad kolumn.

NACKER

Det är lite komplext med komplexa frågor. Behöver underhålla 2 kodbaser i underfrågorna



  1. Återställ rotlösenordet för MySQL Server

  2. Introduktion till SQL-datatyper

  3. Rensa MySQL-frågecache utan att starta om servern

  4. MySQL-datakällan visas inte i Visual Studio