sql >> Database >  >> RDS >> Mysql

MySQL RAND() hoe vaak kan het worden gebruikt? gebruikt het /dev/random?

De MySQL pseudo-willekeurige nummergenerator is volledig deterministisch. De documenten zeggen:

Het kan /dev/random niet gebruiken omdat MySQL is ontworpen om op verschillende besturingssystemen te werken, waarvan sommige geen /dev/random hebben.

MySQL initialiseert een standaard seed bij het opstarten van de server, met behulp van het gehele getal dat wordt geretourneerd door time(0) .Als u geïnteresseerd bent in de bronregel, deze bevindt zich in de MySQL-bron in het bestand sql/mysqld.cc, functie init_server_components() . Ik denk niet dat het zichzelf ooit opnieuw zaait.

Dan zijn de daaropvolgende "willekeurige" getallen uitsluitend gebaseerd op het zaad. Zie bronbestand mysys_ssl/my_rnd.cc, functie my_rnd() .

De beste oplossing voor uw taak met willekeurige selectie, voor zowel de prestaties als de kwaliteit van randomisatie, is het genereren van een willekeurige waarde tussen de minimale primaire sleutelwaarde en de maximale primaire sleutelwaarde. Gebruik vervolgens die willekeurige waarde om een ​​primaire sleutel in uw tabel te selecteren:

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

De reden dat u> in plaats van =zou gebruiken, is dat u mogelijk hiaten in de id hebt omdat rijen worden verwijderd of teruggedraaid, of dat u andere voorwaarden in uw WHERE-component hebt, zodat u hiaten tussen rijen hebt die overeenkomen met uw voorwaarden .

De nadelen van deze meer dan methode:

  • Rijen die zo'n gat volgen, hebben een grotere kans om gekozen te worden, en hoe groter het gat, hoe groter de kans.
  • U moet de MIN(id) en MAX(id) weten voordat u de willekeurige waarde genereert.
  • Werkt niet zo goed als je meer dan één willekeurige rij nodig hebt.

Voordelen van deze methode:

  • Het is veel sneller dan ORDER BY RAND(), zelfs voor een bescheiden tafelgrootte.
  • Je kunt een willekeurige functie buiten SQL gebruiken.


  1. mysql-groep door min . te hebben

  2. Hoe maak je websites met Java?

  3. MySQL 5.6 DATETIME accepteert geen milliseconden/microseconden

  4. php mysql-array - voeg array-info in mysql in