sql >> Databasteknik >  >> RDS >> Mysql

När fungerar MySQL ORDER BY RAND() i ordning?

Du har rätt, det kommer att tillämpa ORDER BY efter att ha minskat antalet rader med WHERE, GROUP BY och HAVING. Men det kommer att gälla ORDER BY före LIMIT.

Så om du filtrerar ner antalet rader tillräckligt, ja, ORDER BY RAND() kan uppnå vad du vill utan en stor prestandapåverkan. Det finns en legitim fördel med kod som är enkel och lätt att läsa.

Problemet kommer när du tänker din fråga bör reducera raderna till något litet, men med tiden när din data växer blir antalet rader som den behöver sortera stort igen. Eftersom din fråga då gör LIMIT 10 på det sorterade resultatet döljer det faktum att du utför ORDER BY RAND() på 500k rader. Du ser bara prestandan på ett mystiskt sätt bli sämre.

Jag har skrivit om alternativa metoder för att välja en slumpmässig rad i min bok SQL Antipatterns:Avoiding the Fallgropar med databasprogrammering , eller i andra svar här på Stack Overflow:



  1. SQL Server SHOWPLAN_ALL

  2. Lagrad procedur ökar inkompatibel med sql_mode=only_full_group_by trots att sql_mode är tomt

  3. *VARNING* Kan inte öppna fler databaser buggar med Microsoft Office build 2201

  4. Mysql dynamisk trigger skapande i lagrad procedur