Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

DELETE para varios registros resultantes de un SELECT en otra tabla

Estas en el tema de DELETE para varios registros resultantes de un SELECT en otra tabla en el foro de Mysql en Foros del Web. Hola! Tengo un par de tablas de 300.000 registros en la misma base de datos en un motor MySQL 5. Necesito borrar de la tabla ...
  #1 (permalink)  
Antiguo 25/08/2011, 13:52
 
Fecha de Ingreso: junio-2007
Mensajes: 8
Antigüedad: 16 años, 10 meses
Puntos: 0
DELETE para varios registros resultantes de un SELECT en otra tabla

Hola!

Tengo un par de tablas de 300.000 registros en la misma base de datos en un motor MySQL 5.

Necesito borrar de la tabla A los que esten en la tabla B.

estoy utilizando:

Código PHP:
DELETE FROM tablaA WHERE id IN (SELECT id FROM tablaB
Pero esto consume demasiada maquina y paraliza el servidor.

Me gustaria que me guiaran en la mejor manera de realizar este procedimiento.
  #2 (permalink)  
Antiguo 30/08/2011, 08:10
 
Fecha de Ingreso: junio-2007
Mensajes: 8
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: DELETE para varios registros resultantes de un SELECT en otra tabla

Tal vez no fui claro en lo que necesito, debo borrar los registros de la tabla A que tambien esten en la tabla B.
La tabla B es del orden de los 300.000 registros. Lo mismo que la tablaA
  #3 (permalink)  
Antiguo 30/08/2011, 08:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: DELETE para varios registros resultantes de un SELECT en otra tabla

¿Ya revisaste el manual de referencia (MySQL::13.2.1. Sintaxis de DELETE)?
Probemos algo así:

Código MySQL:
Ver original
  1. DELETE FROM tablaA INNER JOIN tablaB ON tablaA.id = tablaB.id
  2. USING tablaA;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 30/08/2011, 10:33
 
Fecha de Ingreso: junio-2007
Mensajes: 8
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: DELETE para varios registros resultantes de un SELECT en otra tabla

Gracias gnzsoloyo

Hay algo en la sintaxis que me va mal:
Código MySQL:
Ver original
  1. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN TablaB ON TablaA.id=TablaB.id USUNG TablaA' at line 1
Sin embargo la sentencia que yo utilice hacia el trabajo, pero demasiado lento, 60000 registros en 6 horas.

Lo que que pasa me imagino que esta relacionado con esto:
Código MySQL:
Ver original
  1. 7.2.16. Velocidad de sentencias DELETE
  2.  
  3. The time to delete individual records is exactly proportional to the number of indexes. To delete records more quickly, you can increase the size of the key cache.

Sigo buscando, cualquier ayuda muchas gracias
  #5 (permalink)  
Antiguo 30/08/2011, 10:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: DELETE para varios registros resultantes de un SELECT en otra tabla


Bueno, parece que el problema es que en lugar de USING estás escribiendo USUNG...

La próxima vez postea la sentencia completa, para asegurarnos de lo que estás tratando de ejecutar.

Respecto al segundo resaltado (la próxima vez ponlo con las etiquetas de nota y no de código, eso no hace referencia a la sintaxis, sino al efecto que tienen los índices en los borrados. Como es lógico, mientras más índices haya definidos sobre una tabla, más tardará el borrado. Por eso se recomienda no abusar de ellos.
En tu caso, el borrado parece afectar sólo al índice primario, que normalmente es bastante rápido, pero en cualquier caso estamos hablando de 30.000 registros...
Cita:
Sin embargo la sentencia que yo utilice hacia el trabajo, pero demasiado lento, 60000 registros en 6 horas.
El problema central es que no se puede optimizar un WHERE, y que el WHERE se aplica sobre toda la tabla leída y al final. Por eso te aconsejo usar INNER JOIN para obtener el borrado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 30/08/2011, 11:57
Avatar de winderj90  
Fecha de Ingreso: agosto-2011
Ubicación: Caracas - Venezuela
Mensajes: 8
Antigüedad: 12 años, 8 meses
Puntos: 4
Respuesta: DELETE para varios registros resultantes de un SELECT en otra tabla

Bueno creo q la tabla no esta indexada, es decir, q no has declarado el index de las tablas. primero verifica eso y prueba con tu Queri de nuevo q la estructura esta bien...
  #7 (permalink)  
Antiguo 30/08/2011, 12:15
 
Fecha de Ingreso: junio-2007
Mensajes: 8
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: DELETE para varios registros resultantes de un SELECT en otra tabla

Gracias de nuevo gnzsoloyo

Para la nota de la respuesta del motor de MySQL, cambie el nombre de las tablas para no perder el contexto y ahí fue donde escribí mal la clausula USING.

De nuevo la respuesta del motor y la sentencia
Código SHELL:
Ver original
  1. mysql> use contactosmail
  2. Reading table information for completion of table and column names
  3. You can turn off this feature to get a quicker startup with -A
  4.  
  5. Database changed
  6. mysql> DELETE FROM contactos INNER JOIN Eliminar ON contactos.mail = Eliminar.mail USING contactos;
  7. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN Eliminar ON contactos.mail = Eliminar.mail USING contactos' at line 1
  8. mysql>

Recordemos que lo que quiero hacer bien es este proceso
Código MySQL:
Ver original
  1. DELETE FROM contactos WHERE mail IN (SELECT mail FROM Eliminar)

La nota que extraje del manual de MySQl hace referencia, a lo que parece ser una particularidad en la eliminacion de registros en MySQl.
Me gustaría confirmar si es cierto que puede utilizar mucha maquina este tipo de DELETE MULTIPLE o simplemente no lo estoy haciendo de la mejor manera.

En cuanto a la nota de winderj90 que me parece muy a lugar, resulta que estas tablas no tienen indice por que se usan para acumular cargas de datos de diferentes fuentes y no tienen clave alguna.

Gracias por las respuestas sigo buscando.

Última edición por nelson60s; 30/08/2011 a las 13:58

Etiquetas: delete, registros, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:19.