详细介绍线上MySQL某个历史数据表分区
admin
2023-05-19 21:22:30
0

本文主要给大家简单讲讲线上MySQL某个历史数据表分区,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望线上MySQL某个历史数据表分区这篇文章可以给大家带来一些实际帮助。

背景:

    线上的一个历史数据库,业务方反馈经常遇到一个范围查询就导致CPU迅速飙升的情况。拿到他们提供的SQL后,SQL类似下面这种:

select * from `order_his` where `xxxx` = '222' AND `XXXX` <> 1 AND order_time > '2016-11-01 00:00:00' AND order_time < '2017-06-01 00:00:00' \G

explain看了下发现基本上是全表扫描了,效率太低了,并且他们都是按月查询的,因此我们就对这张表按月进行分区,就能大大减少扫描的行数。

注意:TIMESTAMP类型的列,只能基于UNIX_TIMESTAMP函数进行分区,切记!

### 原始order_his表类似如下这种结构:

CREATE TABLE `order_his` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `order_time` timestamp NULL DEFAULT NULL,

  `pay_time` timestamp NULL DEFAULT NULL,

  `create_time` timestamp NULL DEFAULT NULL,

  `update_time` timestamp NULL DEFAULT NULL,

  PRIMARY KEY (`id`),

) ENGINE=InnoDB AUTO_INCREMENT=47603581 DEFAULT CHARSET=utf8;

step0 创建一个表结构和原先的表一样的tmp表

create table `order_his_tmp` like `order_his`;

详细介绍线上MySQL某个历史数据表分区

step1  修改原有的主键,将分区键添加到主键里。

alter table `order_his_tmp` drop primary key,add primary key(id,order_time);

必须把分区键加到主键里面,不然step2也会报错提醒你这样做的。

step2 分区操作

ALTER TABLE `order_his_tmp` PARTITION BY RANGE (UNIX_TIMESTAMP (order_time))   

(  

PARTITION  P201601  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-02-01')) ,

PARTITION  P201602  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-03-01')) ,

PARTITION  P201603  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-04-01')) ,

PARTITION  P201604  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-05-01')) ,

PARTITION  P201605  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-06-01')) ,

PARTITION  P201606  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-07-01')) ,

PARTITION  P201607  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-08-01')) ,

PARTITION  P201608  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-09-01')) ,

PARTITION  P201609  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-10-01')) ,

PARTITION  P201610  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-11-01')) ,

PARTITION  P201611  VALUES LESS THAN  (UNIX_TIMESTAMP('2016-12-01')) ,

PARTITION  P201612  VALUES LESS THAN  (UNIX_TIMESTAMP('2017-01-01')) ,

PARTITION  P201701  VALUES LESS THAN  (UNIX_TIMESTAMP('2017-02-01')) ,

PARTITION  P201702  VALUES LESS THAN  (UNIX_TIMESTAMP('2017-03-01')) ,

PARTITION  P201703  VALUES LESS THAN  (UNIX_TIMESTAMP('2017-04-01')) ,

PARTITION  P201704  VALUES LESS THAN  (UNIX_TIMESTAMP('2017-05-01')) ,

PARTITION  P201705  VALUES LESS THAN  (UNIX_TIMESTAMP('2017-06-01')) ,

PARTITION  P201706  VALUES LESS THAN  (UNIX_TIMESTAMP('2017-07-01'))

);  

step3、将原先表的数据灌入新的tmp表

insert into `order_his_tmp` select * from `order_his`;

step4、查询验证

explain partitions select * from `order_his_tmp` where `xxxx` = '222' AND `XXXX` <> 1 AND order_time > '2015-11-01 00:00:00' AND order_time < '2015-12-21 00:00:00' \G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: order_his

   partitions: p201511,p201512   ### 可以看到这里走的是2015年11和12月,这2个分区

...........部分内容省略.............

注意: 当时在线上操作的时候,发现即使做了分区,执行计划里面显示的还是ALL全表扫描了,于是根据这个SELECT 加了个索引解决了这个问题。这里没有真实环境不好贴图出来。

step5、替换原先的表

通知开发同学当前不要对`order_his`表执行查询操作。

然后我们执行:

rename table `order_his` to `order_his_nopart`;

rename table `order_his_tmp` to `order_his`;

这样的话,新的`order_his`表就是分区表啦。

step6、添加分区表

后期如果需要加分区的话,只要执行如下这种操作就可以添加一个新的分区

ALTER TABLE `order_his` ADD PARTITION ( PARTITION P201707 VALUES LESS THAN (UNIX_TIMESTAMP('2017-08-01'))) ;

当然,如果我们想省事的话,就在step2的时候,一次性多创建很多分区(我当时是按月建分区,一直创建到2019年)

线上MySQL某个历史数据表分区就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的行业资讯。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。

相关内容

热门资讯

牛蛙抗生素超标5倍,真把消费者... 文 | 心 冥深夜嗦蛙一时爽,一看检测报告“火葬场”。近日,“抗生素牛蛙”冲上热搜,给人看得一哆嗦,...
男子外出喝酒后深夜被人送回,家... 2025年8月21日,甘肃陇西县47岁男子张某某外出与人喝酒,其父母多次电话寻人,电话多由他人接听。...
安德烈·科尔图诺夫:当资本主义... 【文/观察者网专栏作者 安德烈·科尔图诺夫】 两千年前,蒙爱圣徒约翰警示所有罪人和无信之人:“拒绝把...
华为WATCH GT 7手表真... IT之家 8 月 3 日消息,华为 WATCH GT 7 系列手表新品海报今日登陆各大城市大屏,宣传...
大脑也有“带宽”瓶颈?他们发现... 原标题:开辟脑机接口“通信带宽”增强新范式(“咖”说科技) 人类大脑与物理世界之间存在“通信带宽”。...
招致强烈反对后,法庭临时叫停以... 【环球网报道 记者 李飒】据《以色列时报》《耶路撒冷邮报》等以媒8月2日报道,耶路撒冷地方法院当天发...
韩国 “赏月号” 探测器将观测... 8月3日,财闻海外资讯消息,SpaceX猎鹰9号火箭上面级残骸将于8月5日撞击月球表面,韩国首枚月球...
日本熊本商场爆炸,两名女员工本... 据凤凰卫视报道,日本熊本县嘉岛町永旺购物中心在强震后发生爆炸,造成7人死亡。公司高层8月2日晚出席遇...
AI圈最会“追风”的男人,杀入... 作者丨晨阳 编辑丨小龙 离开英伟达一个月后,贾扬清带着新公司Intent Lab杀回了战场。 没有...
小米汽车:澎程的长滑轨在损耗特... 来源:环球网 【环球网科技综合报道】8月3日,小米汽车在回答用户关于“车内的长滑轨用久了会不会出异响...