Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL otrzymuje losową wartość między dwiema wartościami

Właściwie ROUND((RAND() * (max-min))+min) jest najlepszym sposobem w MySQL na robienie tego, co chcesz. Jest to również najlepszy sposób w ActionScript, JavaScript i Python. Szczerze mówiąc, wolę to od PHP, ponieważ jest wygodniejsze.

Ponieważ nie wiem, ile wierszy będziesz zwracać, nie mogę ci doradzić, czy lepiej do tego użyć PHP czy MySQL, ale jeśli masz do czynienia z dużą liczbą wartości, prawdopodobnie lepiej wyjdziesz przy użyciu MySQL.

Uzupełnienie

Pojawiło się więc pytanie, czy jest to lepsze w PHP czy MySQL. Zamiast wdawać się w debatę na temat zasad, uruchomiłem następujące:

<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 jest szybszy o około 2-3%.

Jeśli jednak tego użyjesz (zwróć uwagę, że MySQL zwraca więcej kolumn):

<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 wypada w tyle o 3-4% (bardzo niespójne wyniki) (mniej więcej takie same wyniki, jeśli nie używasz przypisania indeksu tablicy dla $r[2]).

Wydaje się, że główna różnica wynika z liczby rekordów powracających do PHP, a nie z samego systemu randomizacji. Tak więc, jeśli potrzebujesz kolumny A, kolumny B i wartości losowej, użyj PHP. Jeśli potrzebujesz tylko wartości losowej, użyj MySQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przestawić schemat encji-atrybutu-wartości MySQL?

  2. Połącz grupuj według i policz mysql

  3. Zamień pierwszą literę każdego słowa na wielką literę w istniejącej tabeli

  4. Jak zabić wszystkie procesy w liście procesów Mysql show?

  5. MySQL:Szybki podział typów złączeń