http://lobert.iteye.com/blog/1955841

前些天拿到一个表,将近有4000w数据,没有任何索引,主键。(建这表的绝对是个人才)

这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计。。。。。(这要用超级计算机才能统计得出来吧),只能帮前人填坑了。。。。

数据太大,决定用分区来重构。


如果你发现是empty,说明你的mysql版本不够,分区至少要5.1

下面针对业务查询,决定用时间来做range分区(还有list,hash等类型),一个月一个区.

按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。

新建一个表:

  1. CREATE TABLE `xxxxxxxx` (
  2. `crttm` int(11) NOT NULL,
  3. `srvid` int(11) NOT NULL,
  4. `evtid` int(11) NOT NULL,
  5. `aid` int(11) NOT NULL,
  6. `rid` int(11) NOT NULL,
  7. `itmid` int(11) NOT NULL,
  8. `itmnum` int(11) NOT NULL,
  9. `gdtype` int(11) NOT NULL,
  10. `gdnum` int(11) NOT NULL,
  11. `islmt` int(11) NOT NULL,
  12. KEY `crttm` (`crttm`),
  13. KEY `itemid` (`itmid`),
  14. KEY `srvid` (`srvid`),
  15. KEY `gdtype` (`gdtype`)
  16. ) ENGINE=myisam DEFAULT CHARSET=utf8
  17. PARTITION BY RANGE (crttm)
  18. (
  19. PARTITION p201303 VALUES LESS THAN (unix_timestamp('2013-04-01')),
  20. PARTITION p201304 VALUES LESS THAN (unix_timestamp('2013-05-01')),
  21. PARTITION p201305 VALUES LESS THAN (unix_timestamp('2013-06-01')),
  22. PARTITION p201306 VALUES LESS THAN (unix_timestamp('2013-07-01')),
  23. PARTITION p201307 VALUES LESS THAN (unix_timestamp('2013-08-01')),
  24. PARTITION p201308 VALUES LESS THAN (unix_timestamp('2013-09-01')),
  25. PARTITION p201309 VALUES LESS THAN (unix_timestamp('2013-10-01')),
  26. PARTITION p201310 VALUES LESS THAN (unix_timestamp('2013-11-01')),
  27. PARTITION p201311 VALUES LESS THAN (unix_timestamp('2013-12-01')),
  28. PARTITION p201312 VALUES LESS THAN (unix_timestamp('2014-01-01')),
  29. PARTITION p201401 VALUES LESS THAN (unix_timestamp('2014-02-01'))
  30. );

 

注意:

1. primary key和unique key必须包含在分区key的一部分,否则在创建primary key和unique index时会报”ERROR 1503 (HY000)“

mysql> create unique index idx_employees1_job_code on employees1(job_code);
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

mysql> ALTER TABLE `skate`.`employees1` ADD PRIMARY KEY (`id`) ;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function

2. 范围分区添加分区只能在最大值后面追加分区
3. 所有分区的engine必须一样
4. 范围分区分区字段:integer、数值表达式、日期列,日期函数表达式(如year(),to_days(),to_seconds(),unix_timestamp())

将旧的表数据导入到新表后,看到新表的数据都分布到不同的区了!

维护命令:


添加分区

  1. alter table xxxxxxx add partition (partition p0 values less than(1991));  //只能添加大于分区键的分区

删除分区

  1. alter table xxxxxxx drop partition p0; //可以删除任意分区

删除分区数据

  1. alter table xxxxxx  truncate partition p1,p2;
  2. alter table xxxxxx  truncate partition all;
  3. delete from xxxxxx where separated < '2006-01-01' or (separated >= '2006-01-01' and separated<'2011-01-01');

重定义分区(包括重命名分区,伴随移动数据;合并分区)

  1. alter table xxxxx reorganize partition p1,p3,p4 into (partition pm1 values less than(2006),
  2. partition pm2 values less than(2011));

rebuild重建分区

  1. alter  table xxxxxx rebuild partition pm1/all; //相当于drop所有记录,然后再reinsert;可以解决磁盘碎片

优化表

  1. alter  table tt2 optimize partition pm1; //在大量delete表数据后,可以回收空间和碎片整理。但在5.5.30后支持。在5.5.30之前可以通过recreate+analyze来替代,如果用rebuild+analyze速度慢

analzye表

  1. alter  table xxxxxx analyze partition pm1/all;

check表

  1. alter  table xxxxxx check partition pm1/all;
  1. show create table employees2;  //查看分区表的定义
  2. show table status like 'employees2'\G;    //查看表时候是分区表 如“Create_options: partitioned”
  3. select * from information_schema.KEY_COLUMN_USAGE where table_name='employees2';   //查看索引
  4. SELECT * FROM information_schema.partitions WHERE table_name='employees2'   //查看分区表
  5. explain partitions select * from employees2 where separated < '1990-01-01' or separated > '2016-01-01';   //查看分区是否被select使用

实战mysql分区(PARTITION)的更多相关文章

  1. 【转载】实战mysql分区(PARTITION)

    转载地址:http://lobert.iteye.com/blog/1955841 前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物 ...

  2. 实战mysql分区

    前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计.....(这要用超级计算机才能统计得 ...

  3. mysql分区partition

    分区后 会产生多个 数据存储文件MYD,MYI ,把内容读取分散到多个文件上,这样减少并发读取,文件锁的概率,提高IO === 水平分区的几种模式:===1. Range(范围) – 这种模式允许DB ...

  4. mysql分区partition详解

    分区管理  论坛 1. RANGE和LIST分区的管理 针对非整形字段进行RANG\LIST分区建议使用COLUMNS分区.  RANGE COLUMNS是RANGE分区的一种特殊类型,它与RANGE ...

  5. 实战mysql存储程序与定时器

    home198979 实战mysql存储程序与定时器 博客分类: mysql 存储过程定时器eventprocedure实战  需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查 ...

  6. 深入解析MySQL分区(Partition)功能

    自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)= 举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. === 水平分区 ...

  7. MySQL分区(Partition)功能

    引用地址:http://blog.csdn.net/tjcyjd/article/details/11194489 自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)=举 ...

  8. 理解MySQL——并行数据库与分区(Partition)

    1.并行数据库 1.1.并行数据库的体系结构并行机的出现,催生了并行数据库的出现,不对,应该是关系运算本来就是高度可并行的.对数据库系统性能的度量主要有两种方式:(1)吞吐量(Throughput), ...

  9. mysql的partition分区

    前言:当一个表里面存储的数据特别多的时候,比如单个.myd数据都已经达到10G了的话,必然导致读取的效率很低,这个时候我们可以采用把数据分到几张表里面来解决问题.方式一:通过业务逻辑根据数据的大小通过 ...

随机推荐

  1. .NET MVC HtmlHepler

    一.HtmlHepler 1.ActionLink() 动态生成 超链接:根据路由规则,生成对应的 html 代码. //1.注册路由信息 routes.MapRoute( name: "D ...

  2. c8051f320学习,单片机不外乎时钟、IO、串口、USB等外设用法

      时钟 IO(输入.输出,如何配置) IO   数字和模拟资源可以通过25个I/O 引脚(C805 1F3 2 0 ),每个端口引脚都可以被定义为 通用I/O(GPIO)或 0 模拟输入 所有端口I ...

  3. web安全——目录

    说明 写这个目录是为了方便阅读.也是为了记录统一的问题. 这个系列,并不一定是全的,也不一定是对的,所以请大家多做过滤. 这里面场景比较多的是本人在实践中遇到的问题,然后自己思考抽象的. 目录 web ...

  4. 再次认识 vertical-align

    css中的基础知识,上次在刷 segmentfault 遇见了一个相关的问题有再次看过 vertical-align 的描述.今天自己也遇见一个类似的问题,再次深入学习一下. vertical-ali ...

  5. Docker总结(图片打开略慢请知晓)

  6. android SwipeRefreshLayout google官方下拉刷新控件

    下拉刷新功能之前一直使用的是XlistView很方便我前面的博客有介绍 SwipeRefreshLayout是google官方推出的下拉刷新控件使用方法也比较简单 今天就来使用下SwipeRefres ...

  7. display~

  8. Chrome DevTools good good study day day up

    Chrome DevTools 官方页面 https://developer.chrome.com/devtools

  9. 51nod 1040最大公约数和(欧拉函数)

    1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 给出一个n,求1-n这n个数,同n的最大公约数 ...

  10. bzoj 3743

    这道题用到了4个dfs,分别是找出所有家的最小生成树,找出一点距离树的最小距离,找出每个点儿子距离的最大值(不包括父亲,也就是指不包括根节点的子树),用父亲的值来更新自己 因为我们可以知道:如果我们在 ...