Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL obtient une valeur aléatoire entre deux valeurs

En fait, ROUND((RAND() * (max-min))+min) est le meilleur moyen dans MySQL de faire ce que vous voulez. C'est également le meilleur moyen en ActionScript, JavaScript et Python. Honnêtement, je le préfère au PHP parce que c'est plus pratique.

Parce que je ne sais pas combien de lignes vous renverrez, je ne peux pas vous dire s'il est préférable d'utiliser PHP ou MySQL pour cela, mais si vous avez affaire à un grand nombre de valeurs, vous ferez probablement mieux en utilisant MySQL.

Avenant

Donc, il y avait une question de savoir si c'était mieux en PHP ou MySQL. Au lieu d'entrer dans un débat sur les principes, j'ai lancé ce qui suit :

<pre><?php

$c = mysql_connect('localhost', 'root', '');

if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) FROM dual' );
    $r = mysql_fetch_array( $r );
}
$end = microtime(1);

echo  ($end - $start) . " for MySQL select".PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
    $r = mysql_fetch_array( $r );
    $r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);

echo  ($end - $start) . " for PHP select".PHP_EOL;

MySQL est plus rapide d'environ 2 à 3 %.

Si vous utilisez ceci, cependant (remarque, plus de colonnes sont renvoyées par MySQL) :

<pre><?php

$c = mysql_connect('localhost', 'root', '');

if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) as rd, 200 as two, 10 as ten FROM dual' );
    $r = mysql_fetch_array( $r );
}
$end = microtime(1);

echo  ($end - $start) . " for MySQL select".PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
    $r = mysql_fetch_array( $r );
    $r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);

echo  ($end - $start) . " for PHP select".PHP_EOL;

MySQL est en retard de 3 à 4 % (résultats très incohérents) (à peu près les mêmes résultats si vous n'utilisez pas d'affectation d'index de tableau pour $r[2]).

La différence majeure, semble-t-il, vient du nombre d'enregistrements renvoyés à PHP et non du système de randomisation lui-même. Donc, si vous avez besoin de la colonne A, de la colonne B et d'une valeur aléatoire, utilisez PHP. Si vous n'avez besoin que de la valeur aléatoire, utilisez MySQL.