2012-01-26 19 views

Respuesta

13

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 
+0

¡Clavado! Gracias – silkAdmin

+0

¡Tenga en cuenta que puede eliminar menos de 4000 filas! –

1
delete from yourTable limit 4000 
+0

duh! Gracias:) – silkAdmin

+1

Lo quería al azar.) – Vyktor

+0

esto es al azar. No puede decir qué filas se eliminarán. –

0
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.

0

Si tuviera que aventurar una conjetura:

DELETE FROM table where id = (SELECT id FROM table ORDER BY rand() LIMIT 1) LIMIT 10 
Cuestiones relacionadas