前些天拿到一个表,将近有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. RHEL7禁用网卡命名规则

    [root@rhel7 ~]# vi /etc/sysconfig/grub GRUB_TIMEOUT= GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g ...

  2. oracle11g-R2静默安装报错[INS-32013]解决方案

    问题描述: oracle静默安装很强大...,参数搞不对.安装就扯dan了....这个报错搞了一个下午.终于搞定了如释负重.... 如果当初选择仅仅安装oracle软件就没多事情.想一步完成(数据库软 ...

  3. taskkill命令应用

    taskkill命令用来在控制台下杀死进程 举例: 杀死PID为4276的进程 E:\android-sdk-windows\tools>taskkill /PID 4276 错误: 无法终止 ...

  4. 【Oracle+PHP】php连接oracle设定字符集,避免乱码

    数据库用oracle,当php连接oracle的时候,最好指定字符集. 查PHP手册,oci_connect的第四个参数为charset,这是关键. 首先获取oracle的字符集,运行“select ...

  5. 【C#入门经典视频教程】-第001课-C#入门-认识C#

    C#入门-认识C# C ---> C++ --> C# (C++++) j++ j++ 有一门可能比这个C#更流行的语言 java 使用的教程:c#入门经典第五版 操作系统:windows ...

  6. Kubernetes 选择 IPVS

    什么是 IPVS ? IPVS (IP Virtual Server)是在 Netfilter 上层构建的,并作为 Linux 内核的一部分,实现传输层负载均衡. IPVS 集成在 LVS(Linux ...

  7. 使用gprof对应用程序做性能评测

    1,包含头文件gperftools/profiler.h 2,代码结构如下: int main() { // codes ProfilerStart("./profile"); / ...

  8. Safari导入书签

    1.打开Safari 这边safari会自动带出一些关联的浏览器,但如果你要导入的浏览器不在这里的话,就需要看第二步. 2.比如,这里我要从QQ浏览器导入,先打开QQ浏览器. 其他浏览器都类似,找到书 ...

  9. 如何搜索IP的地理位置

    如何搜索IP的地理位置 http://www.ip138.com/ 打开上边这个网页以后,会显示自身的IP及地理位置,,,,也可以搜索别人的IP和地理位置,手机号等:截图如下:

  10. Linux下安装LAMP(Apache+PHP+MySql)和禅道

    1.更新yum源: yum update -y 2.安装Apache+PHP+MySql yum install httpd mysql-devel mysql-server mysql-php ph ...