Mysql询服很长时间里使用的变量

0

的问题

我有一个mysql事件和运行的怪诞日至9:45。

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;

在查询[y m是yearmonth和ym是编制索引]当我的替代品具有可变@v_ym这充分表扫描和表被锁定为进一步插入。 在那里的时候,我给出的数值直接使用的是索引和输出快。

该表包含逾10万个记录。

创建表

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

的解释的计划,用于2种类型的

enter image description here

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

最好的答案

1

什么样的百分比表是在"当月"? 如果是多样的东西20%,那么就没有修复--表扫描可能很快。 如果是低于20%,然后,如你所怀疑,@变量可能是小人。 在这种情况下,改变测试

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

很快将建立和维持一个汇总表a PRIMARY KEY 日和ssaname. 这将会有小计的每一天。 它将维持作为数据 INSERTed 或每天晚上午夜过后。

然后9:45查询变得非常快。 也许这么快,你甚至不需要这样做只是一天一次,而是在"需求"。

更多讨论: http://mysql.rjweb.org/doc.php/summarytables

我建议你使用 NOW() 而不是的 SYSDATE() --前者是恒定的声明;后者不是。

bts_faults 看起来像它可能是一个太字节的大小。 如果是这样,你可能不想到在这里的方法,以使较小。

如果Auto_inc值是3.8B,但只有10米行,这是否意味着你是清洗'旧'数据? 你想讨论加快删除? (启动一个新的问题,如果你这样做。)

2021-11-21 06:31:56

仍然没有工作,改变现在的(), 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; 这是不使用指数上创建ym,在那里作为同一查询工作时快速提取(YEAR_MONTH从(DATE_SUB(NOW()、间隔1日)))替换为202111表只包含18Million数据。
sriman narayana

@srimannarayana-啊...我想我看到这个问题。 我有"varchar=date-恒定的"让我们改变它对"varchar=char-恒"。 我修改了我的答案。
Rick James

@srimannarayana-请添加经订正的 SELECT 及其 EXPLAIN 你的问题。
Rick James

该解释paln2的查询是增加在这个问题
sriman narayana

@srimannarayana-我看不到 CAST 被用来获得的价值。 这似乎是一种数据类型的问题,所以我需要投。
Rick James

其他语言

此页面有其他语言版本

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