实战mysql分区
前些天拿到一个表,将近有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分区的更多相关文章
- 实战mysql分区(PARTITION)
http://lobert.iteye.com/blog/1955841 前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与 ...
- 【转载】实战mysql分区(PARTITION)
转载地址:http://lobert.iteye.com/blog/1955841 前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物 ...
- 实战mysql存储程序与定时器
home198979 实战mysql存储程序与定时器 博客分类: mysql 存储过程定时器eventprocedure实战 需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查 ...
- MySql分区、分表和分库
MySql分区.分表和分库 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 一些问题的解释: 1.为什么要分表和分区? 日常开发中 ...
- Atitit 分区后的查询 mysql分区记录的流程与原理
Atitit 分区后的查询 mysql分区记录的流程与原理 1.1.1. ibd是MySQL数据文件.索引文件1 1.2. 已经又数据了,如何分区? 给已有的表加上分区 ]1 1.3. 分成4个区, ...
- MySQL分区总结
MySQL支持RANGE,LIST,HASH和KEY四种分区.其中,每个分区又都有一种特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区 ...
- Mysql 分区处理NULL的得方式
MySQL分区处理NULL值得方式 一般情况下,MySQL的分区把NULL当做零值,或者一个最小值进行处理 对于range分区 create table test_null( id int ) par ...
- mysql分区及实例演示
一.为什么要分区? 需求:大数据.解决方案:分而治之,更细一点即为.将大表和大索引分为一个更小的操作单元 在mysql中,分区允许将表.索引和索引编排表细分为更小的单元.分区后,每个分区有自己单独的名 ...
- mysql分区
<?php /* 分区 目录 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. ...
随机推荐
- 存储过程—导出table数据为inser sqlt语句
Sql Server Management Studio没有将table中数据导出为insert语句的功能. 下面一个很有用的存储过程,可以把某张表的数据导出为insert sql语句.当然Oracl ...
- 【Mysql】php执行脚本进行mysql数据库 备份和还原
一.mysql备份 1.这里使用 php脚本的形式进行mysql 数据库的备份和还原,想看linux的sh版本的,有时间再贴. 2.找到 mysql的[mysqldump] 执行程序,建议phpinf ...
- 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 ...
- POST、GET请求中文参数乱码问题
POST请求中文乱码问题解决方法: 在web.xml文件中添加编码过滤器,如下: <!-- 解决post乱码 --> <filter> <filter-name>C ...
- unknown log format "main" in /nginx/conf/nginx.conf
vi /nginx/conf/nginx.conf找到http{ }模块中的 log_format去掉注释,或是log_format写到了别处. 解决方法: 将log_format 写到http开头 ...
- C语言终极面试及答案分析
第一部分:基本概念及其它问答题 .关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: ). 在函数体,一个被声明为静态的变量在这一函数 ...
- POJ 3683 Priest John's Busiest Day (2-SAT)
Priest John's Busiest Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6900 Accept ...
- Tensorflow CNN入门
一.概论 以图像识别来举例,比如我们让计算机如何识别一张猫的图片识别出猫呢? 老式的计算机视觉是如何做的呢? 比如OpenCV: 首先理解很多算法,比如如何检测线条(Edge Detection) 如 ...
- 【java】详解java中的注解(Annotation)
目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...
- HTML CSS边框阴影的实现
一款用CSS控制背景图像平铺,从而实现区域边框阴影的效果,虽然用到了图片,但可贵之处是本代码不管你需要阴影的区域是多大,它都能自动适应,因些还是很值得收藏一下的,兼容所有的IE浏览器. <!DO ...