实战mysql分区(PARTITION)
http://lobert.iteye.com/blog/1955841
前些天拿到一个表,将近有4000w数据,没有任何索引,主键。(建这表的绝对是个人才)
这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计。。。。。(这要用超级计算机才能统计得出来吧),只能帮前人填坑了。。。。
数据太大,决定用分区来重构。
如果你发现是empty,说明你的mysql版本不够,分区至少要5.1
下面针对业务查询,决定用时间来做range分区(还有list,hash等类型),一个月一个区.
按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。
新建一个表:
- CREATE TABLE `xxxxxxxx` (
- `crttm` int(11) NOT NULL,
- `srvid` int(11) NOT NULL,
- `evtid` int(11) NOT NULL,
- `aid` int(11) NOT NULL,
- `rid` int(11) NOT NULL,
- `itmid` int(11) NOT NULL,
- `itmnum` int(11) NOT NULL,
- `gdtype` int(11) NOT NULL,
- `gdnum` int(11) NOT NULL,
- `islmt` int(11) NOT NULL,
- KEY `crttm` (`crttm`),
- KEY `itemid` (`itmid`),
- KEY `srvid` (`srvid`),
- KEY `gdtype` (`gdtype`)
- ) ENGINE=myisam DEFAULT CHARSET=utf8
- PARTITION BY RANGE (crttm)
- (
- PARTITION p201303 VALUES LESS THAN (unix_timestamp('2013-04-01')),
- PARTITION p201304 VALUES LESS THAN (unix_timestamp('2013-05-01')),
- PARTITION p201305 VALUES LESS THAN (unix_timestamp('2013-06-01')),
- PARTITION p201306 VALUES LESS THAN (unix_timestamp('2013-07-01')),
- PARTITION p201307 VALUES LESS THAN (unix_timestamp('2013-08-01')),
- PARTITION p201308 VALUES LESS THAN (unix_timestamp('2013-09-01')),
- PARTITION p201309 VALUES LESS THAN (unix_timestamp('2013-10-01')),
- PARTITION p201310 VALUES LESS THAN (unix_timestamp('2013-11-01')),
- PARTITION p201311 VALUES LESS THAN (unix_timestamp('2013-12-01')),
- PARTITION p201312 VALUES LESS THAN (unix_timestamp('2014-01-01')),
- PARTITION p201401 VALUES LESS THAN (unix_timestamp('2014-02-01'))
- );
注意:
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())
将旧的表数据导入到新表后,看到新表的数据都分布到不同的区了!
维护命令:
添加分区
- alter table xxxxxxx add partition (partition p0 values less than(1991)); //只能添加大于分区键的分区
删除分区
- alter table xxxxxxx drop partition p0; //可以删除任意分区
删除分区数据
- alter table xxxxxx truncate partition p1,p2;
- alter table xxxxxx truncate partition all;
- 或
- delete from xxxxxx where separated < '2006-01-01' or (separated >= '2006-01-01' and separated<'2011-01-01');
重定义分区(包括重命名分区,伴随移动数据;合并分区)
- alter table xxxxx reorganize partition p1,p3,p4 into (partition pm1 values less than(2006),
- partition pm2 values less than(2011));
rebuild重建分区
- alter table xxxxxx rebuild partition pm1/all; //相当于drop所有记录,然后再reinsert;可以解决磁盘碎片
优化表
- alter table tt2 optimize partition pm1; //在大量delete表数据后,可以回收空间和碎片整理。但在5.5.30后支持。在5.5.30之前可以通过recreate+analyze来替代,如果用rebuild+analyze速度慢
analzye表
- alter table xxxxxx analyze partition pm1/all;
check表
- alter table xxxxxx check partition pm1/all;
- show create table employees2; //查看分区表的定义
- show table status like 'employees2'\G; //查看表时候是分区表 如“Create_options: partitioned”
- select * from information_schema.KEY_COLUMN_USAGE where table_name='employees2'; //查看索引
- SELECT * FROM information_schema.partitions WHERE table_name='employees2' //查看分区表
- explain partitions select * from employees2 where separated < '1990-01-01' or separated > '2016-01-01'; //查看分区是否被select使用
实战mysql分区(PARTITION)的更多相关文章
- 【转载】实战mysql分区(PARTITION)
转载地址:http://lobert.iteye.com/blog/1955841 前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物 ...
- 实战mysql分区
前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计.....(这要用超级计算机才能统计得 ...
- mysql分区partition
分区后 会产生多个 数据存储文件MYD,MYI ,把内容读取分散到多个文件上,这样减少并发读取,文件锁的概率,提高IO === 水平分区的几种模式:===1. Range(范围) – 这种模式允许DB ...
- mysql分区partition详解
分区管理 论坛 1. RANGE和LIST分区的管理 针对非整形字段进行RANG\LIST分区建议使用COLUMNS分区. RANGE COLUMNS是RANGE分区的一种特殊类型,它与RANGE ...
- 实战mysql存储程序与定时器
home198979 实战mysql存储程序与定时器 博客分类: mysql 存储过程定时器eventprocedure实战 需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查 ...
- 深入解析MySQL分区(Partition)功能
自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)= 举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. === 水平分区 ...
- MySQL分区(Partition)功能
引用地址:http://blog.csdn.net/tjcyjd/article/details/11194489 自5.1开始对分区(Partition)有支持 = 水平分区(根据列属性按行分)=举 ...
- 理解MySQL——并行数据库与分区(Partition)
1.并行数据库 1.1.并行数据库的体系结构并行机的出现,催生了并行数据库的出现,不对,应该是关系运算本来就是高度可并行的.对数据库系统性能的度量主要有两种方式:(1)吞吐量(Throughput), ...
- mysql的partition分区
前言:当一个表里面存储的数据特别多的时候,比如单个.myd数据都已经达到10G了的话,必然导致读取的效率很低,这个时候我们可以采用把数据分到几张表里面来解决问题.方式一:通过业务逻辑根据数据的大小通过 ...
随机推荐
- web安全——数据库(mysql)
简介 数据安全是现在互联网安全非常重要一个环节.而且一旦数据出现问题是不可逆的,甚至是灾难性的. 有一些防护措施应该在前面几个博文说过了,就不再赘述.比如通过防火墙控制,通过系统的用户控制,通过web ...
- Lucene.Net的服务器封装+APi组件 (开源)
为什么要封装 真不知道用什么标题合适,我这几天在研究Lucene.Net,觉得把Lucene.Net封装为一个独立的服务器,再提供一个给客户端调用的Api组件应该是一件很意思的事,主要优势有以下: 1 ...
- swagger editor使用
swagger editor使用 swagger是一套开源的API设计工具,包括Swagger UI,Swagger Editor等. Swagger Editor 其中Swagger Editor是 ...
- Button、ImageButton及ImageView详解
Button.ImageButton及ImageView详解 在应用程序开发过程中,很多时候需要将View的background或者src属性设置为图片,即美观又支持点击等操作.常见的有Button. ...
- Xen虚拟化基本原理详解
标签:虚拟化 xen 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wangzan18.blog.51cto.com/80210 ...
- hihocoder1241 Best Route in a Grid
题目链接:hihocoder 1241 题意: n*n的格阵,每个方格内有一个数字.蚂蚁从左上角走到右下角,数字是零的方格不能走,只能向右向下走.蚂蚁走的路径上全部方格的的乘积为s,要使s低位0的个数 ...
- java设计优化--单例模式
单例模式是一种对象创建模式,确保系统中一个类只有一个实例. 在java语言中,这样做有两大好处: 1.对于频繁使用的对象,可以省略创建对象所话费的时间: 2.由于new操作的次数减少,对于系统内存的使 ...
- Java开发利器Myeclipse全面详解
Java开发利器Myeclipse全面详解: Ctrl+1:修改代码错误 Alt+Shift+S:Source命令 Ctrl+7:单行注释 Ctrl+Shift+/ :多行注释 Ctrl+I :缩进( ...
- SharedPrefernces使用实例讲解
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- eclipse汉化
一.准备工作: 1.eclipse点击help——about eclipse查看软件版本,如图: 2.登录官网语言包下载地址:http://www.eclipse.org/babel/download ...