将mysql非分区表转换为分区表(转)
查看表的分布状况
mysql> select count(*) from justin;
+----------+
| count(*) |
+----------+
| 5845246 |
+----------+
1 row in set (0.00 sec)
mysql> select month(create_time),count(*) from justin group by month(create_time);
+-----------------------+----------+
| month(create_time) | count(*) |
+-----------------------+----------+
| 1 | 1128520 |
| 11 | 1574965 |
| 12 | 3141750 |
+-----------------------+----------+
3 rows in set (6.93 sec)
考虑以create_time为分区键建立分区表
第一步 创建中间表,以主键id和分区列为联合主键
CREATE TABLE `temp_justin` (
`id` bigint(1) NOT NULL AUTO_INCREMENT COMMENT '流水号,自增',
`create_time` datetime DEFAULT NULL COMMENT '订单日志创建时间(建立索引)',
PRIMARY KEY (`id`,`create_time`),
) ENGINE=MyISAM AUTO_INCREMENT=6000000 DEFAULT CHARSET=utf8;
表已经存在580多万记录并且不断在增长,因此中间表初始的id值设置成6000000
增加分区,以月为单位
alter table temp_justin partition by range(to_days(create_time))
(
partition p1012 values less than (to_days('2011-01-01')),
partition p1101 values less than (to_days('2011-02-01')),
partition p1102 values less than (to_days('2011-03-01')),
partition p1103 values less than (to_days('2011-04-01')),
partition p1104 values less than (to_days('2011-05-01')),
partition p1105 values less than (to_days('2011-06-01')),
partition p1106 values less than (to_days('2011-07-01')),
partition p1107 values less than (to_days('2011-08-01')),
partition p1108 values less than (to_days('2011-09-01')),
partition p1109 values less than (to_days('2011-10-01')),
partition p11010 values less than (to_days('2011-11-01')),
partition p11011 values less than (to_days('2011-12-01')),
partition p11012 values less than (to_days('2012-01-01'))
);
第二步 重命名表
Alter table justin rename to justin_bak_110113;
Alter table temp_justin rename to justin;
第三步 同步数据
Insert into justin select * from temp_justin;
表里已经存在将近600万条记录,如此批量导入数据会对数据库性能影响很大。
每一万条提交一次,sleep 2s ,53万数据总耗时2 min 39.67 sec。
mysql> create procedure cp_data()
-> begin
-> declare i int;
-> set i=0;
-> while i<60 do
-> insert into justin
-> select * from justin_bak_110113
-> where id >= i*10000 and id <(i+1)*10000;
-> set i=i+1;
-> select sleep(2);
-> end while;
-> end||
Query OK, 0 rows affected (0.04 sec)
mysql>
mysql> delete from justin;
-> ||
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call cp_data();
+----------+
| sleep(2) |
+----------+
| 0 |
+----------+
1 row in set (2 min 39.67 sec)
Query OK, 0 rows affected (2 min 39.67 sec)
mysql> select count(*) from justin;
+----------+
| count(*) |
+----------+
| 525031 |
+----------+
1 row in set (0.00 sec)
查看执行计划,使用了分区扫描
mysql> explain
-> select count(*) from justin where create_time
-> <='2011-01-13' and create_time>'2011-01-04';
+----+-------------+--------------------+-------+---------------+---------+---------+------+--------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------------------+-------+---------------+---------+---------+------+--------+--------------------------+
| 1 | SIMPLE | justin | index | NULL | PRIMARY | 16 | NULL | 525031 | Using where; Using index |
+----+-------------+--------------------+-------+---------------+---------+---------+------+--------+--------------------------+
1 row in set (0.00 sec)
mysql> explain
-> partitions
-> select count(*) from justin where create_time
-> <='2011-01-13' and create_time>'2011-01-04';
+----+-------------+--------------------+-------------+-------+---------------+---------+---------+------+--------+--------------------------+
|
id | select_type | table | partitions | type |
possible_keys | key | key_len | ref | rows |
Extra |
+----+-------------+--------------------+-------------+-------+---------------+---------+---------+------+--------+--------------------------+
|
1 | SIMPLE | justin | p1012,p1101 | index | NULL |
PRIMARY | 16 | NULL | 525031 | Using where; Using index |
+----+-------------+--------------------+-------------+-------+---------------+---------+---------+------+--------+--------------------------+
1 row in set (0.00 sec)
将mysql非分区表转换为分区表(转)的更多相关文章
- oracle 11g 将非分区表转换为分区表在线重定义
--操作的用户需要有以下的权限 GRANT CONNECT, RESOURCE TO CMIGDW; GRANT EXECUTE ON DBMS_REDEFINITION TO CMIGDW; GRA ...
- Oracle 12C 新特性之非分区表转分区表online clause(不停业务+索引有效)
12c以前非分区表需要转换为分区, 如果不停业务的话可以使用在线重定义,只有在表进行切换的时候会有短暂的锁表. 12c 中alter table online clause 实现了表上现有的索引有效, ...
- mysql分表与分区表
mysql分表与分区表 转自:http://blog.51yip.com/mysql/949.html 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具 ...
- 高性能mysql 第7章 mysql高级特性之分区表
分区表: 分区表是一个独立的逻辑表,底层通过多个物理表实现. mysql实现分区表的方式是对底层表的封装.这意味着没有全局索引,索引是建立在底层的每个表上的(跟ORACLE不一样). 用到分区表的几种 ...
- 玩转SQL Server复制回路の变更数据类型、未分区表转为分区表
玩转SQL Server复制回路の变更数据类型.未分区表转为分区表 复制的应用: 初级应用:读写分离.数据库备份 高级应用:搬迁大型数据库(跨机房).变更数据类型.未分区表转为分区表 京东的复制专家 ...
- Hive入门--2.分区表 外部分区表 关联查询
1.查看mysql中metastore数据存储结构 Metastore中只保存了表的描述信息(名字,列,类型,对应目录) 使用SQLYog连接itcast05 的mysql数据库 查看hive数据库 ...
- mysql 非安装版的配置
一直以来都是使用wamp中集成的mysql数据库,今天突然想试试下载一个mysql的zip包进行配置. 一.下载mysql非安装版 下载地址可以到:http://dev.mysql.com/downl ...
- MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题
排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 By:授客 QQ:1033553122 测试环境 win10 MySQL 5.7 问题描述: 执行类似以下mysql查询, SEL ...
- Windows下安装mysql(非安装包)
Windows下安装mysql(非安装包) 参考:https://www.cnblogs.com/yunlongaimeng/p/12558638.html 1.下载MYSQL(慢的话可以用迅雷,或其 ...
随机推荐
- Android 如何去掉手机中横竖屏切换时的转屏动画?
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- php中120个内置函数
php中实现事件模式 https://yq.aliyun.com/ziliao/162660 <?php class Event{ private $events = []; public fu ...
- [转]DOM 中 Property 和 Attribute 的区别
angular的文档: https://angular.io/guide/template-syntax#property-binding https://blog.csdn.net/sunq1982 ...
- window系统下调度数据库类型资源库中的kettle job
已经存在kettle的一个资源库enfo,在目录/works/wxj下面有一个job (testmailsuccess.kjb)如何实现手工在kettle外部执行此job和让系统每天定时的调用此job ...
- Thread-Local Storage for C99
线程本地存储(TLS)是一种机制,通过这样的机制进行变量分配.在每一个现存线程都有一个实例变量.这样的执行模型GCC用来实现这个,起源于IA-64处理器,可是已经被迁移到其它的处理器.它须要大量的支持 ...
- Shell程序荟萃
--------------纯输出----------------1.sh #!/bin/sh echo -e "Hello!world!\a\n"exit 0 --------- ...
- iOS new 和 alloc的区别
一般如果只是 alloc init 那么 用new 是一样的 SomeObject*myObject =[[SomeObject alloc] init]; SomeObject*myObject = ...
- BIO、NIO、AIO差别
网上非常多IO资料,对新手来说.越看越晕.依据自己的理解.总结对照了一下BIO.NIO.AIO. BIO:线程发起IO请求,无论内核是否准备好IO操作,从发起请求起,线程一直堵塞,直到操作完毕. 例如 ...
- 笔试题之javaweb
Java web部分 1.Tomcat的优化经验 答:去掉对web.xml的监视,把jsp提前编辑成Servlet. 有富余物理内存的情况,加大tomcat使用的jvm的内存 2. ...
- js 暂时性死区
1.概念 在代码块内,使用let.const命令声明变量之前,该变量都是不可用的.这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ). 2.注意 “暂时性死区”也意味 ...