add partition mysql_实战mysql分区(PARTITION)
前些天拿到一个表,将近有4000w数据,没有任何索引,主键。(建这表的绝对是个人才)
这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计。。。。。(这要用超级计算机才能统计得出来吧),只能帮前人填坑了。。。。
数据太大,决定用分区来重构。
如果你发现是empty,说明你的mysql版本不够,分区至少要5.1
下面针对业务查询,决定用时间来做range分区(还有list,hash等类型),一个月一个区.
按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。
新建一个表:
Sql代码
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())
将旧的表数据导入到新表后,看到新表的数据都分布到不同的区了!
维护命令:
添加分区
Sql代码
alter table xxxxxxx add partition (partition p0 values less than(1991)); //只能添加大于分区键的分区
删除分区
Sql代码
alter table xxxxxxx drop partition p0; //可以删除任意分区
删除分区数据
Sql代码
alter table xxxxxx truncate partition p1,p2;
alter table xxxxxx truncate partition all;
或
delete from xxxxxx where separated = '2006-01-01' and separated
重定义分区(包括重命名分区,伴随移动数据;合并分区)
Sql代码
alter table xxxxx reorganize partition p1,p3,p4 into (partition pm1 values less than(2006),
partition pm2 values less than(2011));
rebuild重建分区
Sql代码
alter table xxxxxx rebuild partition pm1/all; //相当于drop所有记录,然后再reinsert;可以解决磁盘碎片
优化表
Sql代码
alter table tt2 optimize partition pm1; //在大量delete表数据后,可以回收空间和碎片整理。但在5.5.30后支持。在5.5.30之前可以通过recreate+analyze来替代,如果用rebuild+analyze速度慢
analzye表
Sql代码
alter table xxxxxx analyze partition pm1/all;
check表
Sql代码
alter table xxxxxx check partition pm1/all;
Sql代码
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 '2016-01-01'; //查看分区是否被select使用
add partition mysql_实战mysql分区(PARTITION)相关推荐
- mysql truncate partition_实战mysql分区(PARTITION)
前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与消耗,原先有一个后台对这个表进行统计.....(这要用超级计算机才能统计得 ...
- MySQL分区Partition
概述 随着MySQL单表的数据量越来越大,即使有加索引,查询速度也会越来越慢.如果历史数据无用,可以使用硬删除,但即使把这些数据删除,但底层的数据文件并没有变小.面对这类问题,最有效的方法就是在使用分 ...
- mysql分区(partition)
分区和性能 数据库的应用分为两类: 1.OLTP 在线事务处理,如blog,电子商务,网络游戏 2.OLAP 在线分析处理,如数据仓库,数据集市 3.对于OLAP的应用,分区的确是可以很好地提高查询的 ...
- 深入解析MySQL分区(Partition)功能
= 水平分区(根据列属性按行分)= 举个简单例子:一个包含十年发票记录的表可以被分区为十个不同的分区,每个分区包含的是其中一年的记录. 水平分区的模式: Range(范围) – 这种模式允许DBA将数 ...
- mysql partition 性能_通过分区(Partition)提升MySQL性能
几年前,俺写过一篇题为"The Foundation of Excellent Performance"的文章(现在仍然可以在http://www.tdan.com/i016fe0 ...
- MySQL 表分区 Partition
MySQL InnoDB,MyISAM, 和 NDB 存储引擎都支持分区. 分区的过程就是将一个表和索引分成多个小的部分:逻辑上讲只有一个表和索引,但实际上由多个物理分区组成. 这点和分表不同,分表实 ...
- from mysql partition select_通过分区(Partition)提升MySQL性能[原创翻译]
通过分区(Partition)提升MySQL性能 --MySQL5.1新特性翻译系列 几年前,俺写过一篇题为"The Foundation of Excellent Performance& ...
- 通过分区(Partition)提升MySQL性能
几年前,俺写过一篇题为"The Foundation of Excellent Performance"的文章(现在仍然可以在http://www.tdan.com/i016fe0 ...
- mysql分区为什么提高性能_通过分区(Partition)提升MySQL性能
通过分区(Partition)提升MySQL性能 --MySQL5.1新特性翻译系列 几年前,俺写过一篇题为"The Foundation of Excellent Performance& ...
最新文章
- mvc ajax_返回数据
- python selenium框架_基于python+selenium的框架思路
- Android取消EditText自动获取焦点默认行为
- 小辣椒2019_小辣椒红辣椒7X尊享版(6GB 64GB)参数大全,好便宜的联发科手机
- vim tutor summary
- mysql异机还原_MySQL innobackupex全量备份恢复
- Verilog中parameter(参数)与define(宏定义)的区别
- 冰箱android10,智能手机 篇十:手机冻冰箱总共分几步?AGM推出金嗓子手机H2,超大声音超长待机...
- linux安装酷q机器人,【折腾】在Docker中运行酷Q机器人
- 一个分块矩阵求逆矩阵的结论
- BUG记录----潜艇游戏
- TLD(Tracking-Learning-Detection)一种目标跟踪算法(相关资料很全)
- python timm库
- 【前端学习】前端学习第十九天:浏览器对象模型(BOM)中的对象
- PCL中3D点云特征描述与提取(三)
- nyoj 一笔画问题
- PAT练习 小白鼠排队
- Windows:通过GPO部署iTunes for Windows
- 统一监控报警平台的架构设计思路分享
- Java前后端分离小程序商城源码saas模式