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. [PGM] I-map和D-separation

    之前在概率图模型对概率图模型做了简要的介绍.此处介绍有向图模型中几个常常提到的概念,之前参考的多为英文资料,本文参考的是<概率图模型-原理与技术的>中译版本.很新的书,纸质很好,翻译没有很 ...

  2. TensorFlow 源代码初读感受

    把自己微博发的文章:http://www.weibo.com/1804230372/En7PdlgLb?from=page_1005051804230372_profile&wvr=6& ...

  3. 教你写一个web远程控制小工具

    惯例先上图 晚上躺床上了,发现忘关电脑了,又不想起来关,来用手机控制电脑多好,百度了下,果然一大把.哈,我自己为什么不自己也实现个呢,任意的自己diy.Just do it. 如果不想看如何实现,那么 ...

  4. JavaScript学习笔记-循环输出菱形,并可菱形自定义大小

    var Cen = 6;//定义菱形中部为第几行(起始值为0) //for循环输出菱形 document.write("<button onclick='xh()'>点我for循 ...

  5. UITextView的使用详解

    //初始化并定义大小 UITextView *textview = [[UITextView alloc] initWithFrame:CGRectMake(20, 10, 280, 30)]; te ...

  6. HTML5基础知识(2)--标题标签的使用

    1.HTML文档中包含各种级别的标题,各种级别的标题由<h1>到<h6>元素来定义,<h1>至<h6>标题标记中的字母h是英文headline的简称.其 ...

  7. 总结Controller向View传值的方式(转)

    总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通View页面传一个Model对象 向强类型页面传传 ...

  8. css-@keyframes动画

    详细w3c这里 http://www.cnblogs.com/happyPawpaw/archive/2012/09/12/2681348.html Internet Explorer 10.Fire ...

  9. jsRender 循环for 和props

    jsrender提供多重循环方式 1.{{for array}}循环数组 2.{{props object}}循环对象 1.for array的使用 <body> <div id=& ...

  10. 数据库开发基础-SQl Server 视图

    1.视图的概述            视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据.视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表.视图 ...