Mysql Query dlouhé době, kdy pomocí proměnné

0

Otázka

Měl jsem mysql události a běží ode dne, v 9:45 ráno.

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;

v dotazu [ym je yearmonth a ym je indexována] když jsem náhradník s proměnnou @v_ym to trvá celou tabulku a tabulka je uzamčen pro další vložky. kde, jak, když jsem dal hodnotu přímo, je pomocí index a výstup je rychle.

Tabulka obsahuje více než 10 milionů záznamů.

Vytvoření tabulky je

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

Vysvětlit Plán pro 2 typu jsou

enter image description here

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

Nejlepší odpověď

1

Jaké procento tabulka je v "aktuální měsíc"? Pokud je více než 20%, pak není žádná oprava-tabulku je pravděpodobné, že bude rychlejší. Pokud je to méně než 20%, pak, když máte podezření, @proměnné mohou být darebák. V tomto případě, změnit test

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

Mnohem rychlejší by bylo vybudovat a udržovat Souhrnnou Tabulku s PRIMARY KEY den a ssaname. To by mezisoučty pro každý den. To by být vedeny buď jako data INSERTed nebo každou noc po půlnoci.

Pak do 9:45 dotazu se stává velmi rychle. Možná tak rychle, že ani nemusíte dělat jen jednou za den, ale místo toho "on-demand".

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

Doporučuji vám použít NOW() místo SYSDATE() -- Bývalý je konstantní po prohlášení; druhá nikoliv.

bts_faults vypadá to, že by to mohla být tb ve velikosti. Pokud ano, pravděpodobně nechcete, aby se zde způsoby, jak dělat je menší.

Pokud Auto_inc hodnota je 3,8-B, zatím tam jsou jen 10M řádky, znamená to, že jste proplachování "starých" dat? Chcete diskutovat o urychlení Odstraní? (Začít novou Otázku, pokud jste to udělat.)

2021-11-21 06:31:56

stále ještě pracuje s změna now(), 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; To není pomocí index vytvořen na ym , kde jako stejný dotaz pracuje rychle, když EXTRACT(YEAR_MONTH FROM (DATE_SUB(NOW(), INTERVAL 1 DEN))) je nahrazen 202111 tabulka obsahuje pouze 18Million data.
sriman narayana

@srimannarayana - Ah... myslím, že vidím problém. Měl jsem "varchar = datum-konstanta" Pojďme to změnit "varchar = char-konstanta". Upravil jsem svou Odpověď.
Rick James

@srimannarayana - Prosím, přidejte revidované SELECT a jeho EXPLAIN na vaši Otázku.
Rick James

Vysvětlit pokoji pro 2 dotazy je přidáno v otázce
sriman narayana

@srimannarayana - nevidím CAST používá k získání hodnoty. To se zdá být datový typ problému, takže potřebuju OBSAZENÍ.
Rick James

V jiných jazycích

Tato stránka je v jiných jazycích

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