246 votos

MySQL seleccionar 10 filas aleatorias de 600K filas rápida

¿Cómo se escribe una consulta que selecciona 10 filas al azar de un total de 600k?

229voto

Riedsio Puntos 4500

Un gran post el manejo de varios casos, de los simples, y a los vacíos, a no uniforme con lagunas.

http://jan.kneschke.de/projects/mysql/order-by-rand/

Para el caso más general, aquí está cómo hacerlo:

SELECT name
  FROM random AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM random)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1

Esto supone que la distribución de los identificadores es igual, y que no puede haber brechas en la lista de identificación. Véase el artículo para obtener ejemplos más avanzados

174voto

Preetam Purbia Puntos 1070
SELECT column FROM table
ORDER BY RAND()
LIMIT 10

17voto

snippetsofcode Puntos 374

Estoy recibiendo consultas rápidas (alrededor de 0,5 segundos) con una cpu lenta, la selección de 10 azar raws en un 400K registros de base de datos MySQL no en la memoria caché de 2 gb de tamaño. Vea aquí mi código: selección Rápida de las filas aleatorias en MySQL

<?php
$time= microtime_float();

$sql='SELECT COUNT(*) FROM pages';
$rquery= BD_Ejecutar($sql);
list($num_records)=mysql_fetch_row($rquery);
mysql_free_result($rquery);

$sql="SELECT id FROM pages WHERE RAND()*$num_records<20
   ORDER BY RAND() LIMIT 0,10";
$rquery= BD_Ejecutar($sql);
while(list($id)=mysql_fetch_row($rquery)){
    if($id_in) $id_in.=",$id";
    else $id_in="$id";
}
mysql_free_result($rquery);

$sql="SELECT id,url FROM pages WHERE id IN($id_in)";
$rquery= BD_Ejecutar($sql);
while(list($id,$url)=mysql_fetch_row($rquery)){
    logger("$id, $url",1);
}
mysql_free_result($rquery);

$time= microtime_float()-$time;

logger("num_records=$num_records",1);
logger("$id_in",1);
logger("Time elapsed: <b>$time segundos</b>",1);
?>

5voto

The Surrican Puntos 12882

Bueno, si usted no tiene huecos en las llaves y todos ellos son numéricos se pueden calcular los números al azar y seleccionar aquellas líneas. pero esto probablemente no sea el caso. Así que una solución sería la siguiente:

SELECT * FROM table WHERE key >= FLOOR(RAND()*MAX(id)) LIMIT 1

básicamente asegurar que usted obtiene un número aleatorio int rango de sus claves y, a continuación, seleccione la siguiente mejor cual es mayor. usted tomarse para hacer esto 10 veces.

sin embargo, este NO es realmente reandom porque tus claves de la niebla es probable que no se distribuye de manera uniforme.

es realmente un gran problema y no fácil de resolver, cumpliendo todos los requisitos, mysqls rand() es la mejor youc una, si usted realmente quiere 10 filas aleatorias.

sin embargo, hay un tro de la solución que es rápido, pero también tiene un tradoff cuando se trata de aleatoriedad, pero puede adaptarse mejor a usted. leer sobre ello aquí: ¿Cómo puedo optimizar MySQL ORDER BY RAND() la función?

la pregunta es cómo el azar te hace falta para ser.

¿puedes explicar un poco más para que yo pueda darle una buena solución.

por ejemplo, una empresa en la que trabajé con había una solución donde tenía absoluta aleatoriedad extremadamente rápido. terminó con pre poblar la base de datos con valores aleatorios que fueron seleccionados descendente y el conjunto de valores aleatorios diferentes después de nuevo.

si casi nunca actualización también se podría llenar un incremento de identificación de manera que usted no tiene brechas y pueden calcular teclas al azar antes de seleccionar... depende del caso de uso!

4voto

user1931858 Puntos 710

Cómo seleccionar al azar las filas de una tabla:

A partir de aquí: Seleccionar filas aleatorias en MySQL

Una rápida mejora sobre "exploración de la tabla", es utilizar el índice para recoger al azar ids.

SELECT *
FROM random, (
        SELECT id AS sid
        FROM random
        ORDER BY RAND( )
        LIMIT 10
    ) tmp
WHERE random.id = tmp.sid;

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: