Även om det inte finns något sådant som en "snabb beställning av rand()", finns det en lösning för din specifika uppgift.
För att få en enskild slumpmässig rad , du kan göra som den här tyska bloggaren gör:http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- fallstudie-av-alternativ/ (Jag kunde inte se en hotlink-url. Om någon ser en får du gärna redigera länken.)
Texten är på tyska, men SQL-koden finns en bit ner på sidan och i stora vita rutor, så det är inte svårt att se.
Vad han gör är att göra en procedur som gör jobbet för att få en giltig rad. Det genererar ett slumptal mellan 0 och max_id, försök att hämta en rad, och om den inte finns, fortsätt tills du träffar en som gör det. Han tillåter att hämta x antal slumpmässiga rader genom att lagra dem i en temporär tabell, så du kan förmodligen skriva om proceduren så att den går lite snabbare och bara hämtar en rad.
Nackdelen med detta är att om du tar bort MÅNGA rader, och det finns stora luckor, är chansen stor att det missar massor av gånger, vilket gör det ineffektivt.
Uppdatering:Olika körtider
Det kan ha att göra med indexering. id
är indexerad och snabb att komma åt, medan username
läggs till till resultatet betyder att den måste läsa det från varje rad och lägga det i minnestabellen. Med *
den måste också läsa in allt i minnet, men den behöver inte hoppa runt datafilen, vilket innebär att letandet inte går förlorat.
Detta gör skillnad bara om det finns kolumner med variabel längd (varchar/text), vilket innebär att den måste kontrollera längden och sedan hoppa över den längden, i motsats till att bara hoppa över en angiven längd (eller 0) mellan varje rad.