前些天拿到一个表,将近有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分区的更多相关文章

  1. 实战mysql分区(PARTITION)

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

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

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

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

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

  4. MySql分区、分表和分库

    MySql分区.分表和分库 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 一些问题的解释: 1.为什么要分表和分区? 日常开发中 ...

  5. Atitit 分区后的查询  mysql分区记录的流程与原理

    Atitit 分区后的查询  mysql分区记录的流程与原理 1.1.1. ibd是MySQL数据文件.索引文件1 1.2. 已经又数据了,如何分区? 给已有的表加上分区 ]1 1.3. 分成4个区, ...

  6. MySQL分区总结

    MySQL支持RANGE,LIST,HASH和KEY四种分区.其中,每个分区又都有一种特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区 ...

  7. Mysql 分区处理NULL的得方式

    MySQL分区处理NULL值得方式 一般情况下,MySQL的分区把NULL当做零值,或者一个最小值进行处理 对于range分区 create table test_null( id int ) par ...

  8. mysql分区及实例演示

    一.为什么要分区? 需求:大数据.解决方案:分而治之,更细一点即为.将大表和大索引分为一个更小的操作单元 在mysql中,分区允许将表.索引和索引编排表细分为更小的单元.分区后,每个分区有自己单独的名 ...

  9. mysql分区

    <?php /* 分区 目录 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. ...

随机推荐

  1. 存储过程—导出table数据为inser sqlt语句

    Sql Server Management Studio没有将table中数据导出为insert语句的功能. 下面一个很有用的存储过程,可以把某张表的数据导出为insert sql语句.当然Oracl ...

  2. 【Mysql】php执行脚本进行mysql数据库 备份和还原

    一.mysql备份 1.这里使用 php脚本的形式进行mysql 数据库的备份和还原,想看linux的sh版本的,有时间再贴. 2.找到 mysql的[mysqldump] 执行程序,建议phpinf ...

  3. java正则表达式去除html中所有的标签和特殊HTML字符(以&开头的)

    来源于:https://www.androiddev.net/java%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8E%BB%E9%99%A4ht ...

  4. POST、GET请求中文参数乱码问题

    POST请求中文乱码问题解决方法: 在web.xml文件中添加编码过滤器,如下: <!-- 解决post乱码 --> <filter> <filter-name>C ...

  5. unknown log format "main" in /nginx/conf/nginx.conf

    vi /nginx/conf/nginx.conf找到http{ }模块中的 log_format去掉注释,或是log_format写到了别处. 解决方法: 将log_format 写到http开头 ...

  6. C语言终极面试及答案分析

    第一部分:基本概念及其它问答题 .关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: ). 在函数体,一个被声明为静态的变量在这一函数 ...

  7. POJ 3683 Priest John's Busiest Day (2-SAT)

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6900   Accept ...

  8. Tensorflow CNN入门

    一.概论 以图像识别来举例,比如我们让计算机如何识别一张猫的图片识别出猫呢? 老式的计算机视觉是如何做的呢? 比如OpenCV: 首先理解很多算法,比如如何检测线条(Edge Detection) 如 ...

  9. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  10. HTML CSS边框阴影的实现

    一款用CSS控制背景图像平铺,从而实现区域边框阴影的效果,虽然用到了图片,但可贵之处是本代码不管你需要阴影的区域是多大,它都能自动适应,因些还是很值得收藏一下的,兼容所有的IE浏览器. <!DO ...