记一次现场数据库CPU居高不下,排查和解决过程

现场数据库报警,CPU一直居高不下,后来抓取数据库慢sql,发现主要有两种,1是大量的插入操作;2是触发器里的查询操作。

  • 分析原因:

一般大量插入操作不会导致CPU居高不下,而触发器是相同表的插入之前触发,查询另外一张维表进行字段增强,所以导致插入超时;同时插入的表数据量很大(近7天,8个G的数据量),同时查询操作

没有走任何索引,全表扫描,进而导致CPU居高不下。

  • 解决办法:

  1. 现场停掉触发器。

  2.将触发器的逻辑放到其他模块中实现。

  3. 将业务表,这里以test代替,改造成分区表,将现场表改名后,重新创建分区表,添加分区到后面2年,将过去3天的数据,插入到新的分区表中

---表改名成

rename table test to test111;

---创建test的分区表

create table test (

`id` bigint NOT NULL AUTO INCREMENT,
`name` varchar(255) DEFAULT NULL,
`dept` varchar(255) DEFAULT NULL,
`time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY `primary_id_time` (`id`,`time` )USING BTREE,
KEY `time_idx` (`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION by range (To_DAYS(time))(
PARTITION p20251104 VALUES less than (TO_DAYS('2025-11-04')),
PARTITION p20251105 VALUES less than (TO_DAYS('2025-11-05')),
PARTITION p20251106 VALUES less than (TO_DAYS('2025-11-06'))
);

---添加后续2年的分区

alter table test add PARTITION(

PARTITION p20251107 VALUES less than (TO_DAYS('2025-11-07')),

...

);

---将过去三天的数据插入到新表中

insert into test select * from test111 where time >= date_sub(curdate(),interval 3 day);

4.页面查询语句,带上time分区字段。

posted @ 2025-11-06 17:27  技术虫  阅读(3)  评论(0)    收藏  举报