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 方法
背景知识: 表分区是把逻辑上同一范围的数据保存到同一个文件中,就和超市一样,把同类商品放在同一个区域,把不同的商品放在不同的地方.不同的是超市中 是根据用途分类的,表分区是根据它的取值区间来分的. 分 ...
随机推荐
- Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器
时间关系,本文就 Retrofit 2.0的简单使用 做讲解 至于原理以后有空再去分析 项目全面.简单.易懂 地址: 关于Retrofit 2.0的简单使用如下: https://gitee.c ...
- react 子元素修改父元素值的一个偏方,虽然简单,但是不建议用,
this.state.obj = { name: "小明" } <Zizujian obj={this.state.obj} /> // 子组件这样修改父元素的值 // ...
- android 去掉activity的切换动画
在styles.xml文件中增加样式代码: <style name="AppTheme" parent="Theme.AppCompat.Light.NoActio ...
- 基于springboot的restful接口的单元测试示例
一.知识点 代码中对应的知识点 1.jsonPath github网址 1)操作符见文档 2)方法见文档 3)例子见文档 2.MockMvc(org.springframework.test.web. ...
- JS中的offset scroll event client
一.offset 一般用来检测盒子的偏移.位移,都是只读属性,不能赋值 offsetWidth和offsetHeight表示的是:调用者盒子的宽和高,包括盒子自身的padding和border off ...
- spring mvc mybatis shiro构建cms系统ios android
开发语言: java.ios.android 部署平台: linux.window jdk版本:JDK1.7以上版本 开发工具: eclipse.idea等 服务器中间件:Tomcat 6.7.Jbo ...
- .net core 中使用ef 访问mysql
1.参考文档说修改项目文件添加,就得这么做,不然会报错 <ItemGroup> <DotNetCliToolReference Include="Microsoft.Ent ...
- 安装bazel(syntaxnet依赖工具)
1.简介 Bazel是一个类似于Make的工具,是Google为其内部软件开发的特点量身定制的工具,如今Google使用它来构建内部大多数的软件.它的功能有诸多亮点: 多语言支持:目前Bazel默 ...
- URI编码时遇到特殊字符的处理方式
今天遇到一个问题,在向一个地址发起get请求时,某个参数是这种形式:foo=xx&&yyyy,其中"&&"是参数值的一部分,在调用这个接口时,后台收 ...
- 9. Bookshops in London 伦敦书店
9. Bookshops in London 伦敦书店 (1) Londoner are greater readers.They buy vast numbers of newspapers and ...