`

将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分区表的基本入门教程

    前言 在最近的项目中,我们需要保存大量的数据,而且这些数据是有有效期的,为了提供查询... Hash分区:基于给定的分区个数,将数据分配到不同的分区,HASH分区只能针对整数进行HASH,对于非整形的字段只能通过表达式

    MySQL 5.1中文手冊

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL ...

    高性能MySQL(第3版).part2

    7.1.3如何使用分区表262 7.1.4什么情况下会出问题263 7.1.5查询优化266 7.1.6合并表267 7.2视图270 7.2.1可更新视图272 7.2.2视图对性能的影响273 7.2.3视图的限制274 7.3外键约束275 7.4在MySQL内部存储...

    MySQL 5.1官方简体中文参考手册

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL ...

    mysql5.1中文手册

    通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式...

    MySQL 5.1参考手册

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL ...

    MySQL 5.1参考手册中文版

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动...

    MySQL 5.1参考手册 (中文版)

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL ...

    MYSQL中文手册

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动...

    【数据面试系列】MySQL高频面试题及知识要点.pdf

    Q : 什么是分区表? Q : 分区表类型有哪些? Q : 如何查看当前数据库的字符集? Q : 说说存储过程的优缺点? Q : LIKE 声明中的%和_是什么意思? Q : 主键和候选键有什么区别? Q : 什么是主键、外键、超键、候选键...

    mysql官方中文参考手册

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL ...

    transferdb:Transferdb支持异步数据库模式转换,全量数据导入,导入和增量数据同步功能(Oracle数据库-> MySQL数据库)

    考虑到Oracle分区表特殊且MySQL数据库复杂分区可能不支持,分区表统一认为普通表转换,但是reverse阶段日志中会打印警告【分区表】,若有要求,建议反向之后检查,需手工转换 支持自定义配置表分段类型规则转换(表-...

    MySQL5.1参考手册官方简体中文版

    2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL ...

    mysql表名忽略大小写配置方法详解

    linux下mysql默认是要区分表名大小写的。...这样设置后,表名在硬盘上以小写保存,MySQL将所有表名转换为小写存储和查找表上。该行为也适合数据库名和表的别名。 也就是说,mysql设置为不分区大小写后,创建

    【63课时完整版】大数据实践HIVE详解及实战

    14.Hive中分区表的创建及使用 15.Hive中数据导入的6种方式及其应用场景 16.Hive中数据导出的4种方式及表的导入导出 17.Hive中HQL的基本语法(一) 18.Hive中HQL的基本语法(二) 19.Hive中order by、sort by、...

    Navicat Premium操作手册.7z

    入门9系统需求10注册10安装10维护或升级11最终用户许可协议12连接21常规设置22高级设置24SSL 设置28SSH 设置29HTTP 设置30服务器对象31MySQL 对象31MySQL 表31MySQL 表栏位31MySQL 表索引33MySQL 表外键34MySQL 表...

    generator4j:代码生成器

    当前只用于表名,分区名转换为Java类型名,变量名。 + typeMapper Map &lt;字串,字串&gt;类型映射。将数据库的类型映射为Java类型。 + dataSourceConfig 数据源配置++方言数据库方言数据库方言。 ++ ip 细绳数据库IP。...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例142 将日期和时间转换为时间戳 170 实例143 获取系统中的特定日期和时间 171 实例144 比较时间的大小 172 实例145 计算考试时间 173 实例146 倒计时 173 实例147 网页闹钟 174 实例148 计算程序运行时间 176 第3...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例142 将日期和时间转换为时间戳 170 实例143 获取系统中的特定日期和时间 171 实例144 比较时间的大小 172 实例145 计算考试时间 173 实例146 倒计时 173 实例147 网页闹钟 174 实例148 计算程序运行时间 176 第3...

Global site tag (gtag.js) - Google Analytics