MySQL - Miles de registros con PHP y Mysql

   
Vista:

Miles de registros con PHP y Mysql

Publicado por ZxSpectrum (1 intervención) el 28/06/2017 18:07:33
Buenas tardes:
Tengo unos 40.000 ficheros de texto que deseo volcar a una Base de datos con motor InnoDB y Msql 5.7 para trabajar con indices FULLTEXT.Aparentemente el algorritmo que os adjunto funciona bien pero se vuelve muy lento (El proceso de INSERT INTO) segun va creciendo el fichero. 70000 ficheros-> 1.2GB.

He revisado y modificado los parametros vinculados al Buffer pero no logro acelerar el proceso de ingesta.Es como si al lanzar en el bucle FOR x Insert Into se quedara "frito" he revisado la carga de trabajo del server y está al 10% de procesador y 44% de memoria .ademas tiene discos SSD Tendria que ir fluido.
¿Alguna idea de como optimizar el trabajo de volcado o seccionarlo para evitar que dure dias el volcado?
Muchas gracias a todos
Saludos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
include ("includes/conexion.php");
 
/**************DIRECTORIO ORIGINAL*******************/
$directorio="procesar/";
/****************************************************/
function limpiaTXT($NombreFichero) {
	$Cadena=fopen($NombreFichero ,"r") ;
	$Cadena_Leida=fread($Cadena, filesize ($NombreFichero));
	$output = mb_convert_encoding($Cadena_Leida, "UTF-8", " ISO-8859-1");//Cambiamos de ANSI a UTF8
	$output = preg_replace('/[^\p{Latin} ]+/u', '',$output); //IMPORTANTISIMO ,PERMITIMOS LATIN Ñ,ACENTOS ETC
	return $output;
}
 
function Lectura_y_Volcado_BBDD($directorio) {
	include ("includes/conexion.php");
	$ficheros=scandir($directorio);
	$contador=count ($ficheros);
	$j=0;
 
	$errores="\nSE ADJUNTA LA SIGUIENTE LISTA DE ERRORES DE VOLCADO:\n";
	for ($i=2; $i < $contador; $i++) {
 
		/*TRIMAMOS EL NOMBRE PARA RESCATAR LA FECHA Y LA PAGINA*/
		$año= substr($ficheros[$i],0, 4);
		$mes= substr($ficheros[$i],4, 2);
		$dia= substr($ficheros[$i],6, 2);
		$pagina= substr($ficheros[$i],9, 3);
		$fecha=$año."-".$mes."-".$dia;
 
		/**********LIMPIAMOS LOS FICHEROS Y ESCAPAMOS CARACTERES*********/
 
		$Fichero_Limpio=limpiaTXT($directorio.$ficheros[$i]);
		$contenido=$mysqli->real_escape_string($Fichero_Limpio);//retorna el cuerpo del contenido
		/**********INSERTAMOS EN LA BBDDD*******************************/
		if ($mysqli->query("INSERT INTO  TablaX (ID , Fecha , Pagina , Contenido) VALUES (NULL, '$fecha' , $pagina ,'$contenido')")){
			echo "Se ha insertado correctamente el fichero:".$ficheros[$i]."\n"; $j++;}
 
		else{ $errores.=$fecha."  CON NUMERO DE PAGINA:   ".$pagina."\n";}
 
	}
	echo "\nTOTAL DE FICHEROS PROCESADOS CORRECTAMENTE :".$j." archivos";
	echo $errores;
}
 
Lectura_y_Volcado_BBDD($directorio);
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 xve

Miles de registros con PHP y Mysql

Publicado por xve (1119 intervenciones) el 29/06/2017 13:45:38
Has probado a quitar el indice FULLTEXT?

No es nada normal que tarde tanto... también puedes ver los procesos del mysql para ver cuanto tardan.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Miles de registros con PHP y Mysql

Publicado por ZxSpectrum (3 intervenciones) el 30/06/2017 09:42:07
Me recomiendas quitar el indice y luego agregarlo ,tardaria mas?
Basicamente lo tengo montado asi porque realizo busquedas de texto en el campo contenido este campo está declarado como Tipo TEXT 65.000 caracteres.Si no lo indexo la consulta tarda una eternidad.Alguna propuesta mas?
Mil 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

Miles de registros con PHP y Mysql

Publicado por leonardo_josue (388 intervenciones) el 30/06/2017 16:05:04
Hola ZxSpectrum:

Con permiso de xve, te comento lo siguiente:

1
Me recomiendas quitar el indice y luego agregarlo

Esto es correcto. Cuando haces un proceso de inserción masiva, lo recomendable es deshabilitar todos los índices y las llaves foráneas de tu tabla mientras se realiza el proceso de inserción, y una vez que se terminan de hacer los insert's entonces volver a habilitar o crear los índices... Esto debería hacer más rápido el proceso, haz la prueba y nos comentas.

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

Miles de registros con PHP y Mysql

Publicado por ZxSpectrum (3 intervenciones) el 04/07/2017 00:12:26
Muchas gracias,teneis toda la razon sin indices es mucho mas rapido el proceso de ingesta.He creado el indice y he lanzado consultas y la verdad es que a veces tarda bastante (trabajando con match against contra el campo indexado).Alguna recomendación para optimizar el resultado ?Estamos hablando de 340.000 registros con un campo de tipo TEXT,
Saludos cordiales
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

Miles de registros con PHP y Mysql

Publicado por leonardo_josue (388 intervenciones) el 04/07/2017 15:29:19
Hola de nuevo ZxSpectrum:

¿A qué te refieres con "bastante" cuando te refieres al tiempo de ejecución de una consulta? yo tengo consultas que tardan en ejecutarse 30 o 40 minutos y eso no quiere decir que haya algo malo en la consulta o en el servidor, sino que tiene que ver directamente con la cantidad de información que se está consultando y la complejidad de la consulta...

De cualquier manera puedes afinar algunos parámetros para tratar de mejorar la consulta... checa esta liga y nos comentas.

http://download.nust.na/pub6/mysql/doc/refman/5.0/es/fulltext-fine-tuning.html

Saludos
Leo.
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

Miles de registros con PHP y Mysql

Publicado por ZxSpectrum (3 intervenciones) el 04/07/2017 15:51:24
Muchas Gracias Leo.Tienes toda la razón .325.000 registros con el campo tipo text y el numero de caracteres puede ser elevado.Aparentemente la consulta está correcta pero tarda 10 min en devolver por ejemplo 150.000 resultados.
Quizas me tengo que replantear el proyecto y utilizar Solr Lucene u otro tipo de servidor de indexación de documentos.Aunque claramente me atraía mas esta solución.
Te agradezo el enlace para optimizar el procesado.Lo revisaré.
Saludos cordiales.
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 xve

Miles de registros con PHP y Mysql

Publicado por xve (1119 intervenciones) el 04/07/2017 17:58:40
Devolver 150 mil registros, dependiendo del servidor, aunque utilices un indice de un campo numérico, puede tardar en devolver tantos registros según sea la maquina.... y mas si indicas que te devuelva todo el contenido de cada registro.


Una prueba, seria indicar que solo te devolviera por ejemplo el id, haber si tarda lo mismo o no
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
Revisar política de publicidad