mysql表分区案例
0、整理表空间碎片
optimize table tablename
1、表分区按年分区,季度子分区
alter table key_part
partition by range(year(create_time))
subpartition by hash(quarter(create_time))
subpartitions 4 (
partition p0 values less than (2015),
partition p2015 values less than (2016),
partition p2016 values less than (2017),
partition p2017 values less than (2018),
partition p2018 values less than (2019),
partition p1 values less than maxvalue
);
总共产生24个分区,1年4个季度,6年24个季度。
2、按照天分区月表
create_time支持如下日期格式:
%Y-%c-%d
%Y-%c-%d %h:%i:%s
alter table aa
partition by range (to_days(create_time)) (
partition p01 values less than (to_days('2018-04-01')) engine = innodb,
partition p02 values less than (to_days('2018-04-02')) engine = innodb,
partition p03 values less than (to_days('2018-04-03')) engine = innodb,
partition p04 values less than (to_days('2018-04-04')) engine = innodb,
partition p05 values less than (to_days('2018-04-05')) engine = innodb,
partition p06 values less than (to_days('2018-04-06')) engine = innodb,
partition p07 values less than (to_days('2018-04-07')) engine = innodb,
partition p08 values less than (to_days('2018-04-08')) engine = innodb,
partition p09 values less than (to_days('2018-04-09')) engine = innodb,
partition p10 values less than MAXVALUE engine = innodb
);
explain partitions select * from key_part where create_time>='2018-04-12' and create_time<='2018-04-15'
可以看到只遍历了4个分区表,只扫描了4行,而不是扫描所有的行。
explain partitions select * from key_part where create_time>='2018-04-27'
可以看到只遍历了5个分区表,只扫描了5行,而不是扫描所有的行。
3、按照年分区表
alter table user partition by linear hash(year(create_time)) partitions 12;
在5.7版本之前,对于data和datetime类型的列,如果要实现分区裁剪,只能使用year() 和to_days()函数,在5.7版本中,又新增了to_seconds()函数。
4、MYSQL的分区字段,必须包含在主键字段内或唯一索引内
这是因为表分区时,分区字段必须包含在主键字段内或唯一索引内,一张表只能有一个主键或一个唯一索引,主键和唯一索引不能同时存在
CREATE TABLE `key_part` (
`news_id` int(11) NOT NULL COMMENT '新闻id',
`content` varchar(1000) NOT NULL DEFAULT '' COMMENT '新闻内容',
`u_id` varchar(25) NOT NULL DEFAULT '' COMMENT '来源ip',
`create_time` datetime NOT NULL COMMENT '时间',
PRIMARY KEY (`u_id`,`create_time`),
KEY `create_time` (`create_time`) USING BTREE,
KEY `aa` (`news_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50500 PARTITION BY RANGE COLUMNS(create_time)
(PARTITION p01 VALUES LESS THAN ('2018-01-01') ENGINE = InnoDB,
PARTITION p02 VALUES LESS THAN ('2018-03-01') ENGINE = InnoDB,
PARTITION p03 VALUES LESS THAN ('2018-05-01') ENGINE = InnoDB,
PARTITION p04 VALUES LESS THAN ('2018-07-01') ENGINE = InnoDB,
PARTITION p05 VALUES LESS THAN ('2018-09-01') ENGINE = InnoDB,
PARTITION p06 VALUES LESS THAN ('2018-11-01') ENGINE = InnoDB,
PARTITION p07 VALUES LESS THAN ('2019-01-01') ENGINE = InnoDB,
PARTITION p08 VALUES LESS THAN ('2020-01-01') ENGINE = InnoDB,
PARTITION p09 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) */;
5、Columns分区
alter table key_part
partition by range columns(create_time) (
partition p01 values less than ('2018-01-01') engine = innodb,
partition p02 values less than ('2018-03-01') engine = innodb,
partition p03 values less than ('2018-05-01') engine = innodb,
partition p04 values less than ('2018-07-01') engine = innodb,
partition p05 values less than ('2018-09-01') engine = innodb,
partition p06 values less than ('2018-11-01') engine = innodb,
partition p07 values less than ('2019-01-01') engine = innodb,
partition p08 values less than ('2020-01-01') engine = innodb,
partition p09 values less than maxvalue engine = innodb
);
6、添加表分区
-- 对表重新表分区
alter table lot_order_aa partition by range columns(create_time)(partition p03 values less than ('2018-03-01')); -- 在已有分区的表上,添加表分区
alter table lot_order_aa add partition (partition p05 values less than ('2018-05-01'));
mysql表分区案例的更多相关文章
- MySQL表分区技术
MySQL表分区技术 MySQL有4种分区类型: 1.RANGE 分区 - 连续区间的分区 - 基于属于一个给定连续区间的列值,把多行分配给分区: 2.LIST 分区 - 离散区间的分区 - 类似于按 ...
- Mysql 表分区和性能
以下内容节选自<Mysql技术内幕InnoDB存储引擎> mysql表分区: 分区功能并不是所有存储引擎都支持的,如CSV.MERGE等就不支持.mysql数据库支持的分区类型为水平分区( ...
- Mysql表分区的选择与实践小结
在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快.这时候可能就需要通过分库,分表,分区来解决这些性能瓶颈. 一. 选择合适的解决方法 1. 分库分表. 分库 ...
- Mysql 表分区
是否支持分区:mysql> show variables like '%partition%';+-----------------------+-------+| Variable_name ...
- MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- mysql表分区(摘自 MySQL表的四种分区类型)
一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- MySQL表分区
MySQL的表分区 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以 ...
- mysql表分区、查看分区
原文地址:http://blog.csdn.net/feihong247/article/details/7885199 一. mysql分区简介 数据库分区 数据库分区是一种物理数据库设 ...
- MYSQL 表分区的 3 方法
背景知识: 表分区是把逻辑上同一范围的数据保存到同一个文件中,就和超市一样,把同类商品放在同一个区域,把不同的商品放在不同的地方.不同的是超市中 是根据用途分类的,表分区是根据它的取值区间来分的. 分 ...
随机推荐
- 文件上传的UI自动化
from pywinauto.application import Application import win32gui handle = win32gui.FindWindow("#32 ...
- ABP框架初始化数据(自定义)
找到目录:AbpFramework.EntityFramework>Migrations>SeedData,这目录下创建类:DefaultDataCreator.cs using Syst ...
- centos平台基于snort、barnyard2以及base的IDS(入侵检测系统)的搭建与测试及所遇问题汇总
centos平台基于snort.barnyard2以及base的IDS(入侵检测系统)的搭建与测试及所遇问题汇总 原创 2016年12月19日 01:20:03 标签: centos / snort ...
- Verilog HDL小练习
5s内15Hz4个LED闪烁,再两秒熄灭,循环往复. 引入en,可以使得4个LED灯全亮,以及恢复周期变化. module led(clk_27MHZ, en, led1, led2, led3, l ...
- leveldb 源码编译 vs版本
为什么要windows版本? 因为方便调试跟进 VS的体验真的很不错. 搜索了一段时间才发现GITHUB有windows版本的leveldb 但是使用VS编译也有不少坑 可以下载网络上的其他朋友的版本 ...
- 【APP测试(Android)】--安装卸载
- STM32 + RC522(SPI2 和 模拟SPI)
STM32 + RC522(SPI2 和 模拟SPI) 一. STM32 + RC522(SPI2 模式) 1. 头文件: rc522.h #include "stm32f10x.h&quo ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第2周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第2周学习总结 教材学习内容总结 1.整数:可细分为为short整数(占2字节),int整数(占4字节),long整数( ...
- DX与OpenGL投影矩阵的区别
之前学习DX和OpenGL时到是知道一点,但是没仔细研究过,只是跟着教程抄个公式就过了,看双API引擎时发现转换时是个问题,必须搞懂,gamedev上找了个解释,希望用得上. https://www. ...
- jquery监听滚动条
$(".lx").scroll(function(){ var $this =$(this), viewH =$(this).height(),//可见高度 contentH =$ ...