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


本文主要给大家简单讲讲线上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 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`;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_t开发云主机域名ime)) ( 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 ANDorder_time > ‘2015-11-01 00:00:00’ AND order_time *************************** 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某个历史数据表分区就先给大家讲到这里,对于其它相关问题大家想要了解的可以持续关注我们的行业资讯。我们的板块内容每天都会捕捉一些行业新闻及专业知识分享给大家的。

相关推荐: MySQL数据库总体架构讲义

本文主要给大家介绍MySQL数据库总体架构讲义,希望可以给大家补充和更新些知识,如有其它问题需要了解的可以持续在开发云行业资讯里面关注我的更新文章的。一、数据库的总体架构我们首先来看MySQL数据的总体架构如下:这是一张非常经典的MySQL的系统架构图,通过这…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/07 20:24
下一篇 06/07 20:24

相关推荐