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.