MySQL 表分区 Partition
MySQL InnoDB,MyISAM, 和 NDB 存储引擎都支持分区。
分区的过程就是将一个表和索引分成多个小的部分;逻辑上讲只有一个表和索引,但实际上由多个物理分区组成。
这点和分表不同,分表实际上是将一张表数据根据某些业务字段存储在多个表中。
1、查询是否支持分区功能
使用查询语句:show PLUGINS 查看:
partition ACTIVE STORAGE ENGINE GPL
2、分区类型
1)RANGE 分区
根据给定的连续区间的列值进行分区。
2)LIST 分区
根据离散的值进行分区,创建分区时必须指定。
3)HASH 分区
根据用户自定义的表达式的返回值进行分区,返回值不能为负值。
创建分区时, 用户只需要进行哈希分区的列值或表达式,MySQL 自动选择数据的分区。
4)KEY 分区
使用数据库提供的哈希函数进行分区。
3、分区的使用
RANGE 分区主要用于日期列的分区,例如按年份分区,
create table stock_order(
id int ,
store_id int,
price decimal(10,2),
order_time datetime not null
)engine=INNODB
PARTITION BY RANGE(year(order_time))
(PARTITION p2018 VALUES less than (2018),
PARTITION p2019 VALUES less than (2019),
PARTITION p2020 VALUES less than (2020));
往表中写入几条数据:
insert into stock_order values (1, 101, 50, str_to_date('2018-06-20 10:25:30','%Y-%m-%d %T'));
insert into stock_order values (2, 102, 30.50, str_to_date('2018-05-20 15:25:30','%Y-%m-%d %T'));
insert into stock_order values (10001, 101, 60, str_to_date('2019-05-20 14:25:30','%Y-%m-%d %T'));
insert into stock_order values (10002, 103, 35, str_to_date('2019-06-20 11:55:20','%Y-%m-%d %T'));
添加数据落在不存在的分区的话,会报错:
insert into stock_order values (10002, 103, 35, str_to_date('2021-06-20 11:55:20','%Y-%m-%d %T'));
错误提示:
[SQL] insert into stock_order values (10002, 103, 35, str_to_date('2021-06-20 11:55:20','%Y-%m-%d %T'));
[Err] 1526 - Table has no partition for value 2021
添加分区:
alter table stock_order add PARTITION(PARTITION p2021 values less than (2021))
alter table stock_order add PARTITION(PARTITION p2022 values less than (2022))
4、查看分区数据
select table_name,partition_name, table_rows
from information_schema.`PARTITIONS`
where table_schema=DATABASE() and table_name='stock_order';
返回:
stock_order p2018 0
stock_order p2019 2
stock_order p2020 2
stock_order p2021 0
stock_order p2022 0
stock_order p2022 0
5、分区好处
1)删除分区数据很方便:
alter table book_order drop partition p2018;
2)查询数据落在某个分区的话,速度会提升:
EXPLAIN PARTITIONS
select * from stock_order
where order_time <='2019-12-31' and order_time>='2019-01-01'
1 SIMPLE stock_order p2020 ALL 2 Using where
6、分区限制
1)如果表中存在主键或者唯一索引时,分区列必须是唯一索引的一个组成部分;如果表没有主键和唯一索引,则任意列都可以为分区列。
2)RANGE 类型分区,优化器只能对year(), to_days(), to_seconds(), unix_timestamp()这些函数进行优化选择
MySQL 表分区 Partition相关推荐
- mysql按照省市给表分区_表分区-partition
partition分区: 设置分区限制,t0:1-10,t1:10-20,t2:20-最大值: 插入数据后可以看到topic表出现了t0.t1.t2: 按照散点值分区: 创建地区表: 建立会员表,根据 ...
- MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...
- Mysql表分区的选择与实践小结
2019独角兽企业重金招聘Python工程师标准>>> 在一些系统中有时某张表会出现百万或者千万的数据量,尽管其中使用了索引,查询速度也不一定会很快.这时候可能就需要通过分库,分表, ...
- 处理Zabbix历史数据库办法二---使用MySQL表分区
一 应用场景描述 http://john88wang.blog.51cto.com/2165294/1770582 在前面介绍可以通过创建新表然后导入一个月内的数据到新表,最后删除旧表的方法来处理历史 ...
- mysql 表分区、按时间函数分区、删除分区、自动添加表分区
mysql 表分区的几种方式: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进 ...
- MySql表分区介绍
一.什么是表分区 表分区就是就是把表的数据切分成不同的块进行存储,可以存储在不同的文件系统.而用户所选择的.实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数 ...
- mysql 支持分区表,mysql表分区的限制
头一次使用mysql表分区,遇到不少的问题,现在总结下遇到的问题和解决方案. 1.如果分区值类型不是整型值,会出现如下错误: [Err] 1697 - VALUES value for partiti ...
- MySQL表分区细节逻辑
MySQL表分区细节逻辑 一.建表时进行分区 二.建表后进行分区(消耗资源巨大) 一.建表时进行分区 Range分区表建表语句如下,其中分区键必须和id构成主键和唯一键: create table i ...
- mysql 添加分区_创建,增加,删除mysql表分区
1.测试添加分区和删除分区 ###添加删除range分区 (1)创建一个分区: CREATE TABLE titles ( emp_no INT NOT NULL, title ...
最新文章
- python搜题程序_智慧树Python程序设计基础搜题公众号
- GitHub现在已支持函数定义跳转,妈妈再也不怕我记性差了
- 一步步编写操作系统 41 快表tlb 简介
- mysql max case连用_mysql 嵌套 case when 的问题
- BZOJ.3165.[HEOI2013]Segment(李超线段树)
- JME3中级手册--最佳实践1
- linux halcon 加密狗,不安装HALCON下安装运行版U盘加密狗驱动
- win10美化--打造专属我的windows
- Word把普通表格改为三线表格的方法
- 图片标注工具labeling的安装和使用
- 云存储服务OneDrive捆绑系统销售,30多家欧洲公司投诉微软垄断
- php开发天气可视化,R语言天气可视化应用 | 粉丝日志
- Photoshop制作宠物小精灵球主题图标教程
- MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
- SQLPro Studio for Mac(可视化数据库管理工具)
- python安装anacondapanda_关于pandas:Pyarrow不安装python 3.7(anaconda 5.3.0,windows x64版本)...
- PCB Layout爬电距离、电气间隙的确定
- 针对局域网IM飞秋(feiq)的开发总结
- 西方经济学【微观】名词缩写整理
- 【计算机网络】计算机三级网络——需要理解的题