Linhas aleatórias do MySQL

É tentador simplesmente usar a função RAND () do MySQL para selecionar registros aleatórios de uma tabela. Considere a seguinte consulta:

SELECT FLOOR(7 + (RAND() * 5));

No entanto, ao considerar as despesas gerais, esse é um método bastante caro de se empregar. Isso se torna muito evidente ao lidar com grandes conjuntos de dados.

Uma solução eficaz é selecionar o primeiro e o último ids e deixar o PHP gerar o inteiro aleatório (id). Em seguida, basta verificar se o registro existe usando o número inteiro aleatório. Se existir, adicione o registro a uma matriz de registros.

public function getRandomRecords()
{
// Select the first id in the target table
$statement
= $this->db->prepare("SELECT some_id
FROM table_name

ORDER BY some_id ASC LIMIT 1"
);
$statement
->execute();
$lowest_id
= $statement->fetch(PDO::FETCH_ASSOC);

// Select the last id in the target table
$statement
= $this->db->prepare("SELECT some_id
FROM table_name

ORDER BY some_id DESC LIMIT 1"
);
$statement
->execute();
$highest_id
= $statement->fetch(PDO::FETCH_ASSOC);

$records_array
= array();

while(true)
{
// Generate a random integer
$random_id
= rand( $lowest_id['some_id'], $highest_id['some_id'] );

// Check to see if the record exists
$statement
= $this->db->prepare("SELECT col_one, col_two, etc...
FROM table_name

WHERE some_id = {$random_id}"
;
$statement
->execute();
$result
= $statement->fetchAll(PDO::FETCH_ASSOC);

// If it exists, add it to the array
if($result) {
$records_array
[] = $record;
}

$i
++;

// If the array contains 5 records, stop
if(count($records_array) == 5) {
break;
}
}

return $records_array;
}