MySQL Range 分区实战:解决千万级数据查询性能瓶颈
线上客服平台近期面临查询性能瓶颈,单表数据量已突破 500 万行。除了优化索引外,对大表进行分区是缓解压力的有效手段。本文记录了一次针对 chat_message_history 表实施 Range 分区的完整过程,重点分享在 ALTER TABLE 过程中遇到的坑及解决方案。
初始表结构
通过 SHOW CREATE TABLE 查看原表结构,主键为自增 ID,分区字段为 message_time。
CREATE TABLE `chat_message_history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`visitor_id` varchar(128) DEFAULT NULL,
`visitor_name` varchar(255) DEFAULT NULL,
`contentBlob` blob,
`sender` varchar(32) DEFAULT NULL,
`message_time` datetime DEFAULT NULL COMMENT '消息发送时间',
`jobId` varchar(11) DEFAULT NULL,
`robot_response` varchar(2000) DEFAULT NULL COMMENT '机器人的回复消息',
`skill_group_id` varchar(32) DEFAULT NULL,
`type` varchar(255) DEFAULT NULL,
`new_skill_group_id` varchar(32) DEFAULT NULL,
`channel` varchar() COMMENT ,
`message_id` () ,
`sessionId` () ,
`message_status` () ,
`error_message` () ,
`businessType` () COMMENT ,
`pFlag` () COMMENT ,
(`id`),
KEY `IDX_jobId` (`jobId`),
KEY `idx_his_vis_ctdesc_key` (`visitor_id`,`skill_group_id`,`message_time`)
) CHARSETutf8;

