sql >> Databáze >  >> RDS >> Mysql

MySQL RAND() jak často ji lze používat? používá /dev/random?

MySQL generátor pseudonáhodných čísel je zcela deterministický. Dokumenty říkají:

Nemůže používat /dev/random, protože MySQL je navrženo tak, aby fungovalo na různých operačních systémech, z nichž některé nemají /dev/random.

MySQL inicializuje výchozí seed při spuštění serveru pomocí celého čísla vráceného time(0) .Pokud vás zajímá zdrojový řádek, je ve zdroji MySQL v souboru sql/mysqld.cc, funkce init_server_components() . Nemyslím si, že se to někdy znovu zasévá.

Pak jsou následná "náhodná" čísla založena pouze na semínku. Viz zdrojový soubor mysys_ssl/my_rnd.cc, funkce my_rnd() .

Nejlepším praktickým řešením vašeho úkolu náhodného výběru z hlediska výkonu i kvality randomizace je vygenerování náhodné hodnoty mezi minimální hodnotou primárního klíče a maximální hodnotou primárního klíče. Poté použijte tuto náhodnou hodnotu k výběru primárního klíče ve vaší tabulce:

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

Důvod, proč byste použili> místo =, je ten, že můžete mít mezery v id kvůli odstranění nebo vrácení řádků, nebo můžete mít jiné podmínky v klauzuli WHERE, takže mezi řádky máte mezery, které odpovídají vašim podmínkám. .

Nevýhody této metody větší než:

  • Řádky za touto mezerou mají vyšší šanci, že budou vybrány, a čím větší mezera, tím větší šance.
  • Před vygenerováním náhodné hodnoty musíte znát MIN(id) a MAX(id).
  • Nefunguje tak dobře, pokud potřebujete více než jeden náhodný řádek.

Výhody této metody:

  • Je to mnohem rychlejší než ORDER BY RAND(), a to i při malé velikosti stolu.
  • Můžete použít náhodnou funkci mimo SQL.


  1. Operátor Oracle (+).

  2. Stránka DataTables 2 stránkování nevolá Magnific Popup

  3. Použití jako v MySQL pro vyhledávací operace pomocí vzoru

  4. Postgres FOR LOOP