sql >> Database teknologi >  >> RDS >> Mysql

MySQL RAND() hvor ofte kan det bruges? bruger den /dev/random?

MySQL pseudo-tilfældige talgeneratoren er fuldstændig deterministisk. Lægerne siger:

Den kan ikke bruge /dev/random, fordi MySQL er designet til at fungere på en række forskellige operativsystemer, hvoraf nogle ikke har en /dev/random.

MySQL initialiserer et standard-seed ved serverstart ved hjælp af det heltal, der returneres af time(0) .Hvis du er interesseret i kildelinjen, er den i MySQL-kilden i filen sql/mysqld.cc, funktion init_server_components() . Jeg tror aldrig, den genså sig selv.

Så er de efterfølgende "tilfældige" tal udelukkende baseret på frøet. Se kildefilen mysys_ssl/my_rnd.cc, funktion my_rnd() .

Den bedste løsning til din tilfældige udvælgelsesopgave, for både ydeevne og kvalitet af randomisering, er at generere en tilfældig værdi mellem den mindste primære nøgleværdi og den maksimale primærnøgleværdi. Brug derefter den tilfældige værdi til at vælge en primær nøgle i din tabel:

SELECT ... FROM MyTable WHERE id > $random LIMIT 1

Grunden til at du ville bruge> i stedet for =er, at du muligvis har huller i id'et på grund af rækker, der bliver slettet eller rullet tilbage, eller du kan have andre betingelser i din WHERE-klausul, så du har mellemrum mellem rækker, der matcher dine betingelser .

Ulemperne ved denne større-end-metode:

  • Rækker, der følger et sådant hul, har større chance for at blive valgt, og jo større hul, desto større er chancen.
  • Du skal kende MIN(id) og MAX(id), før du genererer den tilfældige værdi.
  • Virker ikke så godt, hvis du har brug for mere end én tilfældig række.

Fordele ved denne metode:

  • Det er meget hurtigere end ORDER BY RAND(), selv for en beskeden tabelstørrelse.
  • Du kan bruge en tilfældig funktion uden for SQL.


  1. PHP Opdater MySQL-tabel ved hjælp af HTML-formular

  2. Ressource id #6 fejl i PHP med MySQL

  3. sæt ny værdi for ft_min_word_len FULLTEXT i mysql

  4. INSERT INTO med exec med flere resultatsæt