Como optimizar un insert en mysql en el servidor online
Publicado por Yoel (13 intervenciones) el 26/05/2020 18:17:56
Tengo la siguiente situación: estoy realizando un proceso donde creo una tabla y después inserto los datos en ella. El proceso de creación de la tabla se hace rápido, el problema lo tengo cuando hago el insert en la tabla que acabe de crear. El query que realizo para extraer los datos para el insert lo logre disminuir de 8 a 6 ms. Pero aun así me sigue siendo el proceso muy lento. Si lo ejecuto en mi servidor local que está en mi PC con menos recursos que el servidor que el servidor online se demora 5 seg mientras que en el online 20 seg. A continuación les dejo el código para ver si me pueden ayudar.
Gracias.
Gracias.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
public function set_tmptable($fecha1, $fecha2, $search, $idpedido)
{
//Borramos la tabla para volverla a crear.
$this->db->query("DROP TABLE IF EXISTS tmp_resumen");
$tbl = "CREATE TABLE `tmp_resumen` (
`id` int(15) NOT NULL AUTO_INCREMENT,
`id_empl` varchar(15) NOT NULL,
`referencia` int(15) NOT NULL,
`nombre` varchar(150) NOT NULL,
";
$q = $this->db->query("SELECT `periodo`.`fecha_inicio`,`periodo`.`fecha_final` FROM `periodo` WHERE `periodo`.`id` = '".$idpedido."'");
if($q->num_rows > 0){
$obj = $q->fetch_object();
$max = strtotime($obj->fecha_final);
$min = strtotime($obj->fecha_inicio);
for($i = $min; $i<= $max; $i += 86400){
$tbl .= "`f" . date("Y_m_d", $i) . "` varchar(5) NOT NULL,";
}
}
$tbl .= "PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
$this->db->query($tbl);
unset($per_sql);
if (isset($fecha1) and isset($fecha2)) {
$per_sql = "AND asistencia.fecha_ent >= '" . $fecha1 . "' AND asistencia.fecha_ent <= '" . $fecha2 . "'";
} elseif (isset($fecha1) or isset($fecha2)) {
$fecha = ($fecha1) ? $fecha1 : $fecha2;
$per_sql = "AND asistencia.fecha_ent = '" . $fecha . "' ";
}
//Insertamos los datos en la tabla temporal.
$qcolum = $this->db->query("SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name = 'tmp_resumen'");
while ($row_colum = mysqli_fetch_assoc($qcolum)) {
if ($row_colum['COLUMN_NAME'] != 'id') {
$nombre_cor = substr($row_colum['COLUMN_NAME'], 1, 3);
$qresum = $this->db->query("SELECT empleado.id_empl, empleado.fecha_baja, `empleado`.`baja`, empleado.referencia, CONCAT(empleado.apellidos,' ',empleado.nombre) AS nombre,tipo_asist.id, tipo_asist.nombre_abe, `asistencia`.`fecha_ent` FROM asistencia INNER JOIN empleado ON asistencia.id_empl = empleado.id_empl INNER JOIN tipo_asist ON asistencia.id_tipoasist = tipo_asist.id WHERE 1 " . $search . " ORDER BY referencia ASC, fecha_ent ASC ");
while ($row_resum = mysqli_fetch_assoc($qresum)) {
if ((strtotime($row_resum['fecha_baja']) > strtotime($fecha1)) AND $row_resum['baja'] == 1) {
//Comprobamos si existe el usuario en la tabla temporal.
$qempl = $this->db->query("SELECT id FROM tmp_resumen WHERE referencia = '" . $row_resum['referencia'] . "'");
if ($row_colum['COLUMN_NAME'] != 'id_empl' and $row_colum['COLUMN_NAME'] != 'referencia' and $row_colum['COLUMN_NAME'] != 'nombre') {
unset($data);
if (mysqli_num_rows($qempl) > 0) {
$obj = mysqli_fetch_object($qempl);
$campo = $row_colum['COLUMN_NAME'];
if(substr($campo,1) == str_replace("-","_",$row_resum['fecha_ent'])){
$this->db->query("UPDATE tmp_resumen SET ".$campo."='".$row_resum['nombre_abe']."' WHERE id = '".$obj->id."'");
}
//classDb::update_db('tmp_resumen', $data, array('id' => $obj->id));
} else {
$campo = $row_colum['COLUMN_NAME'];
if(substr($campo,1) == str_replace("-","_",$row_resum['fecha_ent'])){
$campos = "id_empl,referencia,nombre,".$campo;
$value = "'".$row_resum['id_empl']."','".$row_resum['referencia']."','".$row_resum['nombre']."','".$row_resum['nombre_abe']."'";
$this->db->query("INSERT INTO tmp_resumen (".$campos.") VALUES (".$value.")");
}
}
}
} elseif((strtotime($row_resum['fecha_baja']) < strtotime($fecha1)) AND $row_resum['baja'] != 1) {
//Comprobamos si existe el usuario en la tabla temporal.
$qempl = $this->db->query("SELECT id FROM tmp_resumen WHERE referencia = '" . $row_resum['referencia'] . "'");
if ($row_colum['COLUMN_NAME'] != 'id_empl' and $row_colum['COLUMN_NAME'] != 'referencia' and $row_colum['COLUMN_NAME'] != 'nombre') {
unset($data);
if (mysqli_num_rows($qempl) > 0) {
$obj = mysqli_fetch_object($qempl);
$campo = $row_colum['COLUMN_NAME'];
if(substr($campo,1) == str_replace("-","_",$row_resum['fecha_ent'])){
$this->db->query("UPDATE tmp_resumen SET ".$campo."='".$row_resum['nombre_abe']."' WHERE id = '".$obj->id."'");
}
} else {
$campo = $row_colum['COLUMN_NAME'];
if(substr($campo,1) == str_replace("-","_",$row_resum['fecha_ent'])){
$campos = "id_empl,referencia,nombre,".$campo;
$value = "'".$row_resum['id_empl']."','".$row_resum['referencia']."','".$row_resum['nombre']."','".$row_resum['nombre_abe']."'";
$this->db->query("INSERT INTO tmp_resumen (".$campos.") VALUES (".$value.")");
}
}
}
}
}
}
}
}
Valora esta pregunta


0