Mysql 쿼리를 복용하는 장시간을 사용하는 변수

0

질문

나는 mysql 이벤트 실행되는 기분 나쁜 일에서 9:45AM.

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;

쿼리에서[ym 은 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

Explain 계획에 대한 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 ...

훨씬 빠른 것을 구축하고 유지하는 Summary 테이블 PRIMARY KEY 의 낮과 ssaname. 이 부분합니다. 그것은 것이 유지되는 하나의 데이터 INSERTed 또는 후에 매일 밤마다습니다.

다음 9:45 쿼리가 매우 빠릅니다. 어쩌면 너무 빨리는 당신도 필요하지 않은 단지 하루에 한 번 있지만,대신에"on-demand".

더 많은 토론: http://mysql.rjweb.org/doc.php/summarytables

나는 당신이 사용하는 것이 좋 NOW()SYSDATE() --전 일정 전체에 문의 후기가 없습니다.

bts_faults 처럼 보이는 것이 테라바이트에서 크기입니다. 그렇다면,당신은 아마 없고 싶은 여기에서 방법을 만들이 작습니다.

는 경우 Auto_inc 값이에서 3.8B,아직 거기에만 10M 행이 있다는 것을 의미 정화'올드'데이터가? 당신은 당신을 논의하고 싶을 가속화 삭제? (새로운 질문을 할 경우.)

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,어디로 동일한 쿼리를 작업할 때 빠른 추출물(연터(DATE_SUB(금(),간격 1 일)))대 202111 테이블만 포함 18Million 데이터입니다.
sriman narayana

@srimannarayana-아 생각해 보는 문제입니다. 했다"varchar=날짜를 일정한자"는 변경"varchar=char-상수". 나는 수정 나의 대답이다.
Rick James

@srimannarayana-추가하십시오 개정 SELECTEXPLAIN 귀하의 질문입니다.
Rick James

명 paln2 쿼리에서 추가 질문
sriman narayana

@srimannarayana-나는 볼 수 없 CAST 되는 것을 얻을하는 데 사용되는 값입니다. 이 될 것으로 보인 데이터 유형 문제,그래서 내가 필요합니다.
Rick James

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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