Mysql Query prendendo tempo in cui l'utilizzo variabile

0

Domanda

Ho avuto un mysql evento e corre raggelante giorno alle 9:45 AM.

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;

nella query [ym è yearmonth e ym è indicizzato] quando ho sostituito con la variabile @v_ym si sta assumendo la scansione completa della tabella e la tabella è bloccata per ulteriori inserti. dove come quando ho dato il valore è direttamente con l'indice e l'uscita è veloce.

La tabella contiene più di 10 milioni di dischi.

Creare la tabella è

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

Lo Spiega il Piano per il tipo 2 sono

enter image description here

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

Migliore risposta

1

Qual è la percentuale del tavolo è il "mese corrente"? Se è più di qualcosa come il 20%, quindi non c'è nessun fix -- una scansione della tabella è probabile che sia più veloce. Se è inferiore al 20%, quindi, come si sospetta, @variabili può essere il cattivo. In tal caso, modificare il test per essere

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

Molto più veloce sarebbe quello di costruire e mantenere una Tabella di Sintesi con un PRIMARY KEY di giorno e ssaname. Questo sarebbe il subtotali per ogni giorno. Sarebbe mantenuto come i dati INSERTed o ogni notte dopo la mezzanotte.

Quindi le 9:45 query diventa molto veloce. Forse è così veloce che non hai nemmeno bisogno di farlo una volta al giorno, ma invece "on-demand".

Discussione: http://mysql.rjweb.org/doc.php/summarytables

Io suggerisco di usare NOW() invece di SYSDATE() -- Il primo è una costante di tutto un economico; il secondo no.

bts_faults sembra che potrebbe essere un terabyte di dimensione. Se è così, probabilmente non si vuole qui di modi per rendere il più piccolo.

Se il Auto_inc valore è al 3,8 B, ma ci sono solo 10M righe, questo significa che si sta svuotando il 'vecchio' di dati? Vuoi discutere di velocizzare la Elimina? (Avvio di una nuova Domanda, se necessario.)

2021-11-21 06:31:56

ancora non funziona con cambio di ora(), 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; Non è usando l'indice creato su ym , dove, come la stessa query funziona veloce quando ESTRAI(YEAR_MONTH DA (DATE_SUB(NOW () INTERVAL 1 GIORNO))) è sostituito dal 202111 La tabella contiene solo 18Million dati.
sriman narayana

@srimannarayana - Ah... credo di vedere il problema. Ho avuto "varchar = data-costante" proviamo a cambiare "varchar = char-costante". Ho modificato la mia Risposta.
Rick James

@srimannarayana - si Prega di aggiungere la revisione SELECT e la sua EXPLAIN per la tua Domanda.
Rick James

L'spiegare n per 2 query viene aggiunto in questione
sriman narayana

@srimannarayana - non vedo l' CAST essere utilizzato per ottenere il valore. Sembra essere un tipo di dati problema, quindi ho bisogno di un CAST.
Rick James

In altre lingue

Questa pagina è in altre lingue

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