Estoy buscando una manera eficiente de seleccionar aleatoriamente 100 filas que satisfagan ciertas condiciones de una tabla MySQL con potencialmente millones de filas.¿Cómo seleccionar al azar varias filas que satisfagan ciertas condiciones de una tabla MySQL?
Casi todo lo que he encontrado sugiere evitar el uso de ORDER BY RAND(), debido a su bajo rendimiento y escalabilidad.
Sin embargo, this article sugiere ORDER BY RAND() todavía se puede utilizar como una "manera buena y rápida" para buscar datos randow.
Basado en este artículo, a continuación se muestra un código de ejemplo que muestra lo que estoy tratando de lograr. Mis preguntas son:
¿Es esta una forma eficiente de selección aleatoria de 100 (o hasta varios cientos) filas de una tabla con los potencialmente millones de filas?
¿Cuándo se convertirá en un problema el rendimiento?
SELECT user.* FROM ( SELECT id FROM user WHERE is_active = 1 AND deleted = 0 AND expiretime > '.time().' AND id NOT IN (10, 13, 15) AND id NOT IN (20, 30, 50) AND id NOT IN (103, 140, 250) ORDER BY RAND() LIMIT 100 ) AS random_users STRAIGHT JOIN user ON user.id = random_users.id
Tiene sentido seleccionar valores aleatorios en un campo con índice. – Kayser
@Kayser, me preocupa que aún tengamos que escanear TODAS las filas para conocer las condiciones DONDE. ¿Va a afectar el rendimiento con una gran tabla (potencialmente millones de filas)? – user1298692
Es probable que el método con la subselección pk reduzca solo marginalmente el tiempo de ejecución. Esto se debe a que con o sin esta técnica, se llama a rand() para todas las filas coincidentes, y el número de filas para ordenar es el mismo. Presumiblemente, esto es interesante si "usuario" tiene muchas columnas, o columnas grandes en tamaño, y mysql no es lo suficientemente inteligente como para esperar después de que el LÍMITE tenga lugar para materializar al usuario. * (Eso debe probarse). –