转载地址: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 分区(range,list,hash)转载

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

  8. MySQL分区(Partition)功能

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

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

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

随机推荐

  1. python学习(二十二) Python 中boolean

  2. OD 实验(五) - 对 PE 结构的简单分析

    载入程序,按 Alt+M 查看内存空间 双击进入程序的 PE 头 这些为 DOS 环境下才会运行的 这个执行 PE 的地址,PE 结构的偏移地址为 C0 找到这个地址 以 PE 开头 SizeOfCo ...

  3. canvas旋转文本

    canvas旋转文本 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  4. redis hash结构如何设置过期时间

    Redis中有个设置时间过期的功能,即通过setex或者expire实现,目前redis没有提供hsetex()这样的方法,redis中过期时间只针对顶级key类型,对于hash类型是不支持的,这个时 ...

  5. 正则表达式RE与扩展正则表达式ERE——grep与egrep

    grep 正则表达式规则: ^ 行首定位符,表示从行首开始进行模式匹配 . 一个非换行符的字符 [ ] 匹配属于此集合的任意一个字符 [^ ] 匹配不属于此集合的任意一个字符 [a-z] (其指定的集 ...

  6. webpy简单使用

    #!/usr/bin/env python import web import pymysql.cursors # Connect to the database connection = pymys ...

  7. PDO execute 执行错误

    PHP   PDO execute 执行错误,原因分析 $dbcon->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);或者 $db ...

  8. ffmpeg编译选项汇总

    编译禁用“jack” 和 “crystalhd” : --disable-crystalhd--disable-indev=jack ================================= ...

  9. 用letsencrypt搭建免费的https网站--nginx篇

    环境:阿里云服务器centos7.3,nignx,letsencrypt做免费的https证书 Let’s Encrypt官网:https://letsencrypt.org/ 1.服务器开放端口:4 ...

  10. 不同应用场景的10个Linux面试问题与解答

    本文由 极客范 - 小道空空 翻译自 Avishek Kumar.欢迎加入极客翻译小组,同我们一道翻译与分享.转载请参见文章末尾处的要求. 这一次我们不再介绍某个特定主题的Linux面试问题,而是随机 ...