Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL RAND() com que frequência pode ser usado? ele usa /dev/random?


O gerador de números pseudo-aleatórios do MySQL é completamente determinístico. Os documentos dizem:

Ele não pode usar /dev/random porque o MySQL foi projetado para funcionar em uma variedade de sistemas operacionais, alguns dos quais não possuem um /dev/random.

O MySQL inicializa uma semente padrão na inicialização do servidor, usando o inteiro retornado por time(0) .Se você estiver interessado na linha fonte, ela está na fonte MySQL no arquivo sql/mysqld.cc, função init_server_components() . Acho que nunca se re-semeia.

Em seguida, os números "aleatórios" subsequentes são baseados apenas na semente. Veja o arquivo fonte mysys_ssl/my_rnd.cc, função my_rnd() .

A solução de prática recomendada para sua tarefa de seleção aleatória, tanto para desempenho quanto para qualidade da randomização, é gerar um valor aleatório entre o valor mínimo da chave primária e o valor máximo da chave primária. Em seguida, use esse valor aleatório para selecionar uma chave primária em sua tabela:
SELECT ... FROM MyTable WHERE id > $random LIMIT 1

A razão pela qual você usaria> em vez de =é que você pode ter lacunas no id devido a linhas sendo excluídas ou revertidas, ou você pode ter outras condições em sua cláusula WHERE para que você tenha lacunas entre as linhas que correspondam às suas condições .

As desvantagens deste método maior que:
  • As linhas que seguem essa lacuna têm uma chance maior de serem escolhidas, e quanto maior a lacuna, maior a chance.
  • Você precisa saber o MIN(id) e MAX(id) antes de gerar o valor aleatório.
  • Não funciona tão bem se você precisar de mais de uma linha aleatória.

Vantagens deste método:
  • É muito mais rápido que ORDER BY RAND(), mesmo para um tamanho de tabela modesto.
  • Você pode usar uma função aleatória fora do SQL.