sql >> Database >  >> RDS >> Mysql

Willekeurige resultaten retourneren (volgens rand() )

De reden dat bestellen via RAND() traag kan zijn, is dat u de database dwingt om de hele tabel daadwerkelijk te sorteren voordat u iets retourneert. Het verminderen van de belasting naar een enkele tabelscan is veel sneller (zij het nog steeds wat traag).

Dit betekent dat u een deel van de weg kunt krijgen door gewoon de bestelling te vermijden:

  SELECT *
    FROM my_table
   WHERE RAND() < 0.1
ORDER BY RAND()
   LIMIT 100

Dit selecteert ongeveer 1% van alle rijen in de tabel, sorteert ze en retourneert de top 100. Houd er rekening mee dat het belangrijkste probleem hier (en ook met het antwoord van @cmd) is dat u er niet zeker van kunt zijn dat de zoekopdracht terugkeert helemaal niets.

De bovenstaande benadering zou een scan van de hele tabel moeten omvatten (om te beslissen welke rijen moeten worden gebruikt), gevolgd door een soort van ongeveer 1% van de rijen. Als je veel rijen hebt, kun je het percentage dienovereenkomstig verlagen.



  1. Taal voor SQL-gegevensmanipulatie

  2. De Oracle Warehouse Builder 11g R2-client installeren

  3. Hoe maak je een tijdelijke tabel in SQL?

  4. Oracle 12c GEDENTIFICEERD DOOR WAARDEN