MySQL - Como optimizar un insert en mysql en el servidor online

 
Vista:
Imágen de perfil de Yoel
Val: 17
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

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.

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
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 Francisco
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Como optimizar un insert en mysql en el servidor online

Publicado por Francisco (73 intervenciones) el 28/05/2020 03:13:54
Hola

Pues te recomiendo que uses un store procedure para que elimines el proceso en frontend

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