Генераторът на псевдослучайни числа MySQL е напълно детерминистичен. Документите казват:
Не може да използва /dev/random, тъй като MySQL е проектиран да работи на различни операционни системи, някои от които нямат /dev/random.
MySQL инициализира начална стойност по подразбиране при стартиране на сървъра, като използва цялото число, върнато от time(0)
.Ако се интересувате от изходния ред, той е в източника на MySQL във файл sql/mysqld.cc, функция init_server_components()
. Не мисля, че някога се засажда отново.
Тогава следващите „случайни“ числа се основават единствено на семето. Вижте изходния файл mysys_ssl/my_rnd.cc, функция my_rnd()
.
Най-доброто решение на практика за вашата задача за произволен избор, както за производителност, така и за качество на рандомизацията, е да генерирате произволна стойност между минималната стойност на първичен ключ и максималната стойност на първичен ключ. След това използвайте тази произволна стойност, за да изберете първичен ключ във вашата таблица:
SELECT ... FROM MyTable WHERE id > $random LIMIT 1
Причината да използвате> вместо =е, че може да имате пропуски в идентификатора поради изтриване или връщане на редове, или може да имате други условия в клаузата WHERE, така че да имате пропуски между редовете, които отговарят на вашите условия .
Недостатъците на този метод по-голямо от:
- Редове след такава разлика имат по-голям шанс да бъдат избрани и колкото по-голяма е разликата, толкова по-голяма е вероятността.
- Трябва да знаете MIN(id) и MAX(id), преди да генерирате произволната стойност.
- Не работи толкова добре, ако имате нужда от повече от един произволен ред.
Предимства на този метод:
- Това е много по-бързо от ORDER BY RAND(), дори за скромни размери на таблицата.
- Можете да използвате произволна функция извън SQL.