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

Optimización de Query

Estas en el tema de Optimización de Query en el foro de Mysql en Foros del Web. Buen día muchachos, Necesito optimizar esta consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original REPLACE INTO pedido ( Id_U , Id_chk , FechaP , Total , ...
  #1 (permalink)  
Antiguo 29/02/2016, 11:47
 
Fecha de Ingreso: febrero-2015
Ubicación: Bogotá
Mensajes: 41
Antigüedad: 9 años, 2 meses
Puntos: 1
Optimización de Query

Buen día muchachos,

Necesito optimizar esta consulta:

Código MySQL:
Ver original
  1. REPLACE INTO pedido(Id_U, Id_chk, FechaP, Total, Cnt, Producto)
  2. VALUES ('$Id_U','$Id_chk','$FechaP','$Total','$Producto','$Cnt')

Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.
Lo que necesito es que entre a ver si el Id_U ya existe no haga nada, si no existe me inserte los datos, pero que sea rápido.

Por que con ese REPLACE pasa por encima de todas las líneas, creo que las remplza y las que no las inserta... pero se demora y cuando hay mucho volumen de datos agrega a una linea datos que no son de ese (enloquece por ratos).

Dicho esto e buscado lo de IF EXISTS en donde se hace un Uptade y un Insert pero se dice que es de desconfiar y que el único medio confiable es un tal BEGIN pero lo vi en Sql server no se en Mysql si funcione o como funcione.

Que me aconsejan...
__________________
La vida es un juego de Ajedrez.
  #2 (permalink)  
Antiguo 29/02/2016, 11:59
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: Optimización de Query

Paramos de un detalle: REPLACE lo que hace es reemplazar un registro con otro, o insertarlo si no existe. Pero el reemplazo es directo, mandatorio, univoco y total. Si no se envían todos los datos, los restantes se vaciarán o nulificarán.
Esta es una práctica muy mala si tienes que hacer validaciones, no es conveniente y está desaconsejada como práctica.
Si lo que necesitas es hacer una inserción si y sólo si el un dato clave no existe previamente, lo que te conviene es usar stored procedures y NUNCA usar REPLACE.
Por otro lado, si los datos restantes pueden ya existir, y no los vas a actual tampoco debes usar REPLACE, sino INSERT IGNORE...

Por un lado, entendamos que NUNCA se deben enviar a insertar o actualizar datos sin previamente haberlos validado. La base no tiene por qué perder el tiempo haciendo validaciones que debiste hacer antes. Es un desperdicio de recursos no solo de base, sino de red, ya que estás haciendo ejecutar procesos inútiles al sistema.

En otras palabras:
1) Si son altas puntuales, manuales (en el sentido que se envían una a una por ,formulario), debes validar ANTES de enviarlas.
2) Si son altas masivas, se deberían procesar por script prevalidado. Es decir que los datos tendrían que haber sido prevalidados y cargados en una tabla transaccional, luego de lo cual se puede usar un SP para que lo haga masivamente.
3) SI el insert masivo es secuencial, en un script de PHP, es conveniente que se envíe a ejecutar por SP, para que encapsule todo el ciclo de validación, inserción o rechazo de cada registro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 29/02/2016, 14:15
 
Fecha de Ingreso: febrero-2015
Ubicación: Bogotá
Mensajes: 41
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Optimización de Query

Si, se que no es una buena practica inicialmente pensaba en actualizar la linea pero el dato llega igual solo necesito que entre los que no están, según el Id.

Lo que sucede es que estoy pasando una base de datos recibida por medio de un txt. Yo abro dicho txt (separado por comas) lo convierto en variables para luego insertar cada variable en cada campo.

Dicho esto y según lo que leo lo mejor es hacer un INSERT IGNORE?

Esté es un script secuencial que se ejecuta cada 1 minuto y aveces menos en donde ''recibe e inserta los nuevos sin afectar los que ya están''. (lo que está entrecomillas es lo que necesito) que no se demore ya que lo que está haciendo es remplazar como tu dices.

Si es con INSERT IGNORE... pido me guies para poder tener un buen y correcto rendimiento.
__________________
La vida es un juego de Ajedrez.

Etiquetas: fecha, optimización, query, sql
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 17:06.