MySQL pseudo-slumptalsgeneratorn är helt deterministisk. Läkarna säger:
Det kan inte använda /dev/random eftersom MySQL är designat för att fungera på en mängd olika operativsystem, av vilka några inte har en /dev/random.
MySQL initierar ett standardfrö vid serverstart, med hjälp av det heltal som returneras av time(0)
.Om du är intresserad av källraden finns den i MySQL-källan i filen sql/mysqld.cc, funktion init_server_components()
. Jag tror aldrig att den såddar sig själv igen.
Sedan baseras de efterföljande "slumpmässiga" siffrorna enbart på fröet. Se källfilen mysys_ssl/my_rnd.cc, funktion my_rnd()
.
Den bästa lösningen för din slumpmässiga urvalsuppgift, för både prestanda och kvalitet på randomisering, är att generera ett slumpmässigt värde mellan det lägsta primärnyckelvärdet och det maximala primärnyckelvärdet. Använd sedan det slumpmässiga värdet för att välja en primärnyckel i tabellen:
SELECT ... FROM MyTable WHERE id > $random LIMIT 1
Anledningen till att du skulle använda> istället för =är att du kan ha luckor i id:t på grund av att rader raderas eller rullas tillbaka, eller så kan du ha andra villkor i din WHERE-sats så att du har luckor mellan raderna som matchar dina villkor .
Nackdelarna med denna mer-än-metoden:
- Rader som följer en sådan lucka har större chans att bli valda, och ju större lucka desto större är chansen.
- Du måste känna till MIN(id) och MAX(id) innan du genererar det slumpmässiga värdet.
- Fungerar inte lika bra om du behöver mer än en slumpmässig rad.
Fördelar med denna metod:
- Det är mycket snabbare än ORDER BY RAND(), även för en blygsam tabellstorlek.
- Du kan använda en slumpmässig funktion utanför SQL.