Consulta de Mysql tomar mucho tiempo de cuando se utiliza la variable

0

Pregunta

Yo tenía un mysql evento y se ejecuta extraño los días a las 9:45 de la mañana.

Begin
 SET @v_ym :=(SELECT extract(year_month from DATE_SUB(SYSDATE(),INTERVAL 1 DAY)));
 SELECT CAST(@ym AS CHAR);
 select ssaname,extract(year_month from date_sub(sysdate(),interval 1 day)) ym,
        omcr.btscount_ssa(ssaname) btscount,sum(case when duration>30 then duration else 0 end) dur_30 from
        btsoutage.bts_faults 
        where ym=@v_ym  and ssaname is not null
        group by ssaname;
END;

en la consulta [ym es yearmonth y ym está indexada] al sustituir la variable @v_ym es tomar análisis completo de la tabla y la tabla está bloqueada para más insertos. donde como cuando me da directamente el valor es mediante el índice y la salida es rápida.

La tabla contiene más de 10 millones de registros.

Crear la tabla es

CREATE TABLE IF NOT EXISTS `bts_faults` (
  `bts_name` varchar(250) DEFAULT NULL,
  `make` varchar(10) DEFAULT NULL,
  `occuredtime` datetime DEFAULT NULL,
  `clearedtime` datetime DEFAULT NULL,
  `duration` int(10) DEFAULT NULL,
  `reason` varchar(100) DEFAULT NULL,
  `site_type` varchar(10) DEFAULT NULL,
  `tech` varchar(5) DEFAULT NULL,
  `fault_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `ssaname` varchar(20) DEFAULT NULL,
  `fault_type` int(1) DEFAULT '0',
  `remarks` varchar(250) DEFAULT NULL,
  `bts_section` varchar(100) DEFAULT NULL,
  `vendor` varchar(50) DEFAULT NULL,
  `occureddate` date DEFAULT NULL,
  `cleareddate` date DEFAULT NULL,
  `ym` varchar(6) DEFAULT NULL,
  `updatedate` datetime DEFAULT NULL,
  `USERNAME` varchar(100) DEFAULT NULL,
  `mask` int(1) DEFAULT '0',
  `mask_cat` varchar(10) DEFAULT NULL,
  `outage_cat` varchar(20) DEFAULT NULL,
  `site_category` varchar(50) DEFAULT NULL,
  `escalated_time` datetime DEFAULT NULL,
  `zone` varchar(20) DEFAULT NULL,
  `zone_fault_reason` varchar(500) DEFAULT NULL,
  `zone_fault_remarks` varchar(500) DEFAULT NULL,
  `zone_username` varchar(20) DEFAULT NULL,
  `zone_updatetime` datetime DEFAULT NULL,
  `zone_fault_duration` int(11) DEFAULT NULL,
  `fault_category` varchar(250) DEFAULT NULL,
  `remarks_1` varchar(2500) DEFAULT NULL,
  PRIMARY KEY (`fault_id`),
  UNIQUE KEY `UIDX_BTS_FAULTS` (`bts_name`,`occuredtime`),
  KEY `indx_btsfaults_ym` (`ym`),
  KEY `indx_btsfaults_cleareddate` (`cleareddate`),
  KEY `Index_btsfaults_btsname` (`bts_name`),
  KEY `index_btsfaults_ssaname` (`ssaname`),
  KEY `indx_btsfaults_occureddate` (`occureddate`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3807469710 DEFAULT CHARSET=latin1

El Explicar el Plan para el tipo 2 son

enter image description here

events mysql
2021-11-20 18:59:15
1

Mejor respuesta

1

¿Qué porcentaje de la tabla se encuentra en el "mes actual"? Si que es más que algo así como el 20%, entonces no hay solución-un examen de la tabla es probable que sea más rápido. Si es menos de un 20%, entonces, como se sospecha, @variables pueden ser el villano. En ese caso, cambiar a la prueba a

 WHERE ym = CAST(
          extract(year_month from DATE_SUB(SYSDATE(),INTERVAL 1 DAY))
                 AS CHAR)
   AND ...

Mucho más rápida sería la de construir y mantener una Tabla de Resumen con un PRIMARY KEY de día y ssaname. Esto tendría la subtotales para cada día. Sería mantenido, como los datos se INSERTed o cada noche, después de medianoche.

Luego de las 9:45 de la consulta se hace muy rápido. Quizás tan rápido que ni siquiera necesita hacer sólo una vez al día, pero en lugar de "on-demand".

Más discusión: http://mysql.rjweb.org/doc.php/summarytables

Le sugiero que utilice NOW() en lugar de SYSDATE() - El primero es constante a lo largo de una declaración; el segundo no lo es.

bts_faults parece que podría ser un terabyte en tamaño. Si es así, usted probablemente no quiere aquí maneras de hacer que sea más pequeña.

Si el Auto_inc valor se encuentra en el 3.8 B, sin embargo, hay sólo 10M filas, esto significa que usted se purga 'viejo' de datos? ¿Quieres hablar de acelerar las Eliminaciones? (Inicio de una nueva Pregunta si lo hacen).

2021-11-21 06:31:56

todavía no funciona con el cambio de ahora(), select ym, ssaname, omcr.btscount_ssa(ssaname) btscount,sum(case when duration>30 then duration else 0 end) dur_30 from btsoutage.bts_faults where ym=EXTRACT(YEAR_MONTH FROM (DATE_SUB(NOW(), INTERVAL 1 DAY)))group by ym, ssaname; No es mediante el índice creado en los varones jóvenes , en donde la misma consulta se trabaja a gran velocidad cuando de EXTRACTO(YEAR_MONTH DE (DATE_SUB(NOW(), INTERVAL 1 DÍA))) es reemplazado por 202111 La tabla contiene sólo 18Million de datos.
sriman narayana

@srimannarayana - Ah... creo que veo el problema. Yo tenía "varchar = fecha-constante" Vamos a cambiarlo a "varchar = char-constante". He modificado mi Respuesta.
Rick James

@srimannarayana - por Favor, agregue la versión revisada de la SELECT y su EXPLAIN a su Pregunta.
Rick James

El explicar paln para 2 consultas que se agrega en la pregunta
sriman narayana

@srimannarayana - no veo la CAST se utiliza para obtener el valor. Parece ser un tipo de problema, así que necesito el molde.
Rick James

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................