Ahora tengo una tabla que tiene 604 000 filas. Me gustaría eliminar 4000 filas aleatorias para que mi tabla solo contenga 600 000 entradas.Mysql Eliminar múltiples filas aleatorias de una tabla
¿Habría una forma rápida de hacerlo?
Muchas gracias.
Ahora tengo una tabla que tiene 604 000 filas. Me gustaría eliminar 4000 filas aleatorias para que mi tabla solo contenga 600 000 entradas.Mysql Eliminar múltiples filas aleatorias de una tabla
¿Habría una forma rápida de hacerlo?
Muchas gracias.
En teoría, esto será aleatorio y rápido. En la práctica, será sólo es rápido:
DELETE FROM tableX
LIMIT 4000
Este será al azar, pero terriblemente lento, con 600K filas:
DELETE FROM tableX
ORDER BY RAND()
LIMIT 4000
Esto no será verdaderamente aleatorio (como se generalmente hay lagunas en los ID) y es posible que ni siquiera elimine exactamente 4000 filas (pero algunas menos cuando hay muchas lagunas), pero es probable que sea más rápido que el anterior.
Una envoltura adicional en una sub consulta es necesaria porque la sintaxis para Eliminar de varias tablas no permite LIMIT
:
DELETE td
FROM
tableX AS td
JOIN
(SELECT t.id
FROM
tableX AS t
CROSS JOIN
(SELECT MAX(id) AS maxid
FROM tableX
) AS m
JOIN
(SELECT RAND() AS rndm
FROM tableX AS tr
LIMIT 5000
) AS r
ON
t.id = CEIL(rndm * maxid)
LIMIT 4000
) AS x
ON
x.id = td.id
Explicar salida (de la subconsulta, de una tabla 400K filas):
id table possible_keys key_len rows
select_type type key ref Extra
1 PRIMARY <derived2> system 1
1 PRIMARY <derived3> ALL 5000
1 PRIMARY t eq_ref PRIMARY PRIMARY 4 func 1 Using where;Using index
3 DERIVED tr index PRIMARY 4 398681 Using index
2 DERIVED Select tables optimized away
¡Clavado! Gracias – silkAdmin
¡Tenga en cuenta que puede eliminar menos de 4000 filas! –
DELETE FROM TABLE ORDER BY RAND() LIMIT 4000;
llevará tiempo, aunque ...
Un rápido w ay a ejecutar (no escribir el código!) pueden ser borrados 4000 separados en un bucle
DELETE FROM TABLE WHERE AssumedPKisInt = <ARandomNumber>
Por supuesto, es necesario asegurarse de que no intenta eliminar filas inexistentes o ya eliminados.
Si tuviera que aventurar una conjetura:
DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10
DELETE FROM tabla WHERE id = RAND() LIMIT 4000'? :) o 'RANDOM()'? ni seguro;) – Vyktor