PHP - Optimizar inserccion de datos a una tabla

   
Vista:
Imágen de perfil de nancy

Optimizar inserccion de datos a una tabla

Publicado por nancy nanshh.nanchy@gmail.com (7 intervenciones) el 30/06/2016 00:56:31
Hola buen día, quisiera que me ayuden en este tema.
tengo una base de datos con dos tablas "datos" y "registros".
En "datos" le inserto los datos desde un excel pero este contiene mas de 30000 registros,
a veces los registros vienen duplicados mas de una vez. Entonces lo que hago es eliminar
a todos aquellos que estan duplicados y haciendolos uno solo y eliminar a todos aquellos que tengan un campo vacio, para
que despues pueda comparar esta tabla con la de "registros" y asi los registros que estan en "datos" y que no
esten en "registros" se copien a "registos".

Y vuelvo a repetir el proceso de eliminar duplicados y hacerlos uno solo, pero ahora solo con la tabla registros.

Con base a esto necesito el apoyo para poder saber algun otro metodo de comparacion para eliminar mis duplicados
ya que el proceso que hice tarda alrededor de 5 min, en Insertar los datos y en comparar ambas tablas
algo que yo no veo muy optimo. Adjunto el codigo que utilizo.
"importar2.php" lo utilizo para insertar a tabla "datos"
"ConsultaCompara.php" lo utilizo para comparar ambas tablas "datos" y "registros"

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip

Optimizar inserccion de datos a una tabla

Publicado por kip (562 intervenciones) el 30/06/2016 05:29:32
Hola, a partir de la linea 26 del archivo importar2.php veo que comienzas a hacer la inserccion de los datos, cambia las lineas por esto a ver si funciona y optimiza tu query:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
foreach ($lineas as $linea_num => $linea)
			{
				$datos = explode(",",$linea);
				//$id = trim($datos[0]);
				if ($datos[3]){
					$nse = trim($datos[1]);
					$ref = trim($datos[2]);
					$ped = trim($datos[3]);
					$esta=trim($datos[4]);
					$fecha=trim($datos[5]);
 
					$consulta = "INSERT INTO datos(nse,ref,ped,esta,fecha)";
					$consulta.= "SELECT * FROM (SELECT '$nse','$ref','$ped','$esta','$fecha' ) AS tmp
									WHERE NOT EXISTS (SELECT null FROM datos WHERE nse = '$nse' OR ref = '$ref' OR ped = '$ped' OR esta = '$esta' OR fecha = '$fecha') LIMIT 1;";
 
					if(!$conexion->query($consulta)){

D esa forma en una sola consulta por cada registro harias un filtro tanto de algun dato que este vacio en el array y asi mismo de un dato duplicado en la tabla.

Y luego la consulta que haces para ver si hay datos duplicados ya no la necesitarias, es decir la consulta donde haces el DELETE e INNJER JOIN.

Prueba y nos cuentas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de nancy

Optimizar inserccion de datos a una tabla

Publicado por nancy nanshh.nanchy@gmail.com (7 intervenciones) el 30/06/2016 22:29:01
Hola buen día. La solucion que me das es buena ya que en efecto los registros los inserta
a un timepo optimo, pero me elimina datos que debe dejar, creo que falto que explicara mas a detalle,
una disculpa por eso.
Mira en ocasiones los ped comparten nse,y ref lo que si tiene que cambiar es el ped, estatus y fecha, por ejemplo:

1 NSE-0707-0091-A-CTL-TX LD3-0707-0004 4502336734 ACEPTADO_POR_PROVEEDOR 29/06/2016
2 NSE-0707-0091-A-CTL-TX LD3-0707-0004 4502336734 ACEPTADO_POR_PROVEEDOR 29/06/2016
3 NSE-0707-0091-A-CTL-TX LD3-0707-0004 4502336735 ACEPTADO_POR_PROVEEDOR 29/06/2016
4 NSE-0707-0091-A-CTL-TX LD3-0707-0004 4502336734 ACEPTADO_POR_PROVEEDOR 29/06/2016
5 NSE-0707-0091-A-CTL-TX LD3-0707-0004 4502336735 TERMINADO_POR_PROVEEDOR 01/06/2017

En este caso el ped 4502336734 se repite 3 veces y por consiguiente se eliminarian 2 para que solo quede un registro de ese pedido.
Tambien podemos observar que el ped 4502336735 comparte nse y ref, con el ped 4502336734, Y que tambien se repite pero con esta y fecha
diferente por lo cual no se elimina ya que cambiaron los datos de 2 campos, comparados
al anterior registro de ese ped.

Y los registros que traigan el campo ped vacio, esos son los unicos que van a borrar, por que aveces el campo fecha o esta viene vacio
pero traen ped, entonces unicamente los que no tengan ped esos si se eilimina.

Y con eso hare el historial de mis pedidos que tienen cambios en esta y fecha.

Espero me puedas ayudar. GRACIAS.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip

Optimizar inserccion de datos a una tabla

Publicado por kip (562 intervenciones) el 03/07/2016 00:10:55
Hola, aun no entiendo del todo, ped y fecha serian entonces los campos que no pueden repetirse?

Prueba asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
foreach ($lineas as $linea_num => $linea) {
	datos = explode(",",$linea);
	//$id = trim($datos[0]);
	if (trim($datos[3])){
		$nse = trim($datos[1]);
		$ref = trim($datos[2]);
		$ped = trim($datos[3]);
		$esta=trim($datos[4]);
		$fecha=trim($datos[5]);
 
		$consulta = "INSERT INTO datos(nse,ref,ped,esta,fecha)";
		$consulta.= "SELECT * FROM (SELECT '$nse','$ref','$ped','$esta','$fecha' ) AS tmp ";
		$consulta.= "WHERE NOT EXISTS (SELECT null FROM datos WHERE (ped = '$ped' AND fecha = '$fecha')) LIMIT 1;";
 
			if(!$conexion->query($consulta)){

Fijate que hago una comprobacion de $datos[3] que vendria a ser $ped y lo hago para ver si esta vacio.

En la consulta coloco que no inserte cuando ped sea igual a la variable ped y la fecha sea igual a la fecha, ya que eso entendi de la explicacion de arriba.

Avisanos si es lo que necesitas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar