Requête Mysql en prenant le temps long où à l'aide de la variable

0

La question

J'ai eu un mysql événement et s'exécute eery les jours à 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;

dans la requête [ym est yearmonth et ym est indexé] quand je suppléant avec la variable @v_ym c'est la pleine prise en analyse de la table et de la table est verrouillée pour plus d'inserts. où que lorsque j'ai donné directement la valeur, il est l'aide de l'index et la sortie est rapide.

Le tableau contient plus de 10 millions de documents.

Create table est

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

Le Plan d'Expliquer pour le type 2 sont

enter image description here

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

La meilleure réponse

1

Quel est le pourcentage de la table est dans le "mois en cours"? Si c'est plus que quelque chose comme 20%, alors il n'y a pas de fix -- une analyse de table est susceptible d'être plus rapide. Si elle est inférieure à 20%, puis, comme vous le soupçonnez, @variables peuvent être le méchant. Dans ce cas, modifiez le test

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

Beaucoup plus rapide serait de construire et de maintenir un Tableau Récapitulatif avec un PRIMARY KEY du jour et de la ssaname. Ce serait les sous-totaux pour chaque jour. Il serait maintenue, car les données INSERTed ou chaque soir après minuit.

Puis le 9:45 requête devient très rapide. Peut-être si rapide que vous n'avez même pas besoin de le faire juste une fois par jour, mais plutôt "à la demande".

Plus de discussion: http://mysql.rjweb.org/doc.php/summarytables

Je vous suggère d'utiliser NOW() au lieu de SYSDATE() - Le premier est constante tout au long de l'énoncé; le second ne l'est pas.

bts_faults regarde comme il pourrait être un téraoctet de taille. Si donc, vous ne voulez probablement pas à ici façons de faire est plus petit.

Si le Auto_inc valeur est à 3,8 B, mais il ya seulement 10M lignes, est-ce à dire que vous êtes la purge des "anciens" de données? Voulez-vous discuter accélérer le Supprime? (Commencer une nouvelle Question si vous le faites).

2021-11-21 06:31:56

toujours pas de travail avec changement de maintenant(), 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; Il n'est pas à l'aide de l'index créé sur ym , alors que la même requête travail rapide lors de l'extraction(YEAR_MONTH DE (DATE_SUB(NOW(), INTERVAL 1 JOUR))) est remplacé par 202111 La table ne contient que 18Million de données.
sriman narayana

@srimannarayana - Ah... je crois que je vois le problème. J'ai eu "varchar = date-constant" nous allons changer pour "varchar = char-constant". J'ai modifié ma Réponse.
Rick James

@srimannarayana - s'il vous Plaît ajouter la version révisée de la SELECT et son EXPLAIN pour votre Question.
Rick James

L'expliquer paln pour 2 requêtes est ajouté dans la question
sriman narayana

@srimannarayana - je ne vois pas l' CAST être utilisé pour obtenir de la valeur. Il semble être un type de problème, j'ai donc besoin de la FONTE.
Rick James

Dans d'autres langues

Cette page est dans d'autres langues

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