一、分区:

分区就是将表的数据按照特定规则存放在不同的区域,也就是将表的数据文件分割成多个小块,在查询数据的时候,只要知道数据数据存储在哪些区域,然后直接在对应的区域进行查询,不需要对表数据进行全部的查询,提高查询的性能。同时,如果表数据特别大,一个磁盘磁盘放不下时,我们也可以将数据分配到不同的磁盘去,解决存储瓶颈的问题,利用多个磁盘,也能够提高磁盘的IO效率,提高数据库的性能。常见的分区类型有:Range分区、List分区、Hash分区、Key分区:

  • (1)Range分区:按照连续的区间范围进行分区
  • (2)List分区:按照给定的集合中的值进行选择分区。
  • (3)Hash分区:基于用户定义的表达式的返回值进行分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
  • (4)Key分区:类似于按照HASH分区,区别在于Key分区只支持计算一列或多列,且key分区的哈希函数是由 MySQL 服务器提供。

1、表分区的优点:

(1)可伸缩性:

  • 将分区分在不同磁盘,可以解决单磁盘容量瓶颈问题,存储更多的数据,也能解决单磁盘的IO瓶颈问题。

(2)提升数据库的性能:

  • 减少数据库检索时需要遍历的数据量,在查询时只需要在数据对应的分区进行查询。
  • 避免Innodb的单个索引的互斥访问限制
  • 对于聚合函数,例如sum()和count(),可以在每个分区进行并行处理,最终只需要统计所有分区得到的结果

(3)方便对数据进行运维管理:

  • 方便管理,对于失去保存意义的数据,通过删除对应的分区,达到快速删除的作用。比如删除某一时间的历史数据,直接执行truncate,或者直接drop整个分区,这比detele删除效率更高;
  • 在某些场景下,单个分区表的备份很恢复会更有效率。

2、表分区的缺陷:

(1)分区字段必须放主键或者唯一索引中;

(2)每个表最大分区数为1024;

3、业务场景举例:

(1)项目需要动态新建、删除分区。比如新闻表,按照时月份进行分区,同时为了防止新闻表过大,只保留最近6个月的分区,同时预建后面3个月的分区,这个删除、预建分区的过程就是分区表的动态管理。

(2)历史数据或不常访问的数据占很大部分,最新或热点数据占的比例不是很大,这时也可以进行表分区。

4、MySQL分区类型:

根据所使用的不同分区规则,可以分成几大分区类型:

序号 分区类型 说明 使用频率
1 RANGE 分区

按照连续的区间范围进行分区

较多
2 LIST 分区

按照给定的集合中的值进行选择分区

一般
3 HASH 分区

基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。

较多
4 KEY 分区

类似于按照HASH分区,除了区别在于KEY分区只支持计算一列或多列,且KEY分区的哈希函数是由MySQL 服务器提供。

一般

(1)range分区:

每个分区的值位于一个给定的连续区间内之内。

PARTITION BY RANGE (id) (

PARTITION p0 VALUES LESS THAN (3),

PARTITION p1 VALUES LESS THAN (6),

PARTITION p2 VALUES LESS THAN (9),

PARTITION p3 VALUES LESS THAN (12),

PARTITION p4 VALUES LESS THAN MAXVALUE

);

(2)List分区:

类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

PARTITION BY LIST (province_id) (

PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8),

PARTITION p1 VALUES IN (9,10,11,12,16,21),

PARTITION p2 VALUES IN (13,14,15,19),

PARTITION p3 VALUES IN (17,18,20,22,23,24)

);

 (3)Hash分区:

基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。 
HASH分区主要用来确保数据在预先确定数目的分区中平均分布。在RANGE和LIST分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中。

create table foo_hash
(empno varchar(20) not null ,
empname varchar(20),
deptno int,
birthdate date not null,
salary int
)
partition by hash(year(birthdate))
partitions 4;

以上创建了4个分区。

(4)Key分区:

类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

create table foo_key

(empno varchar(20) not null ,

empname varchar(20),

deptno int,

birthdate date not null,

salary int

)

partition by key(birthdate)

partitions 4;

(5)复合分区:

子分区是针对 RANGE/LIST 类型的分区表中每个分区的再次分割。子分区可以是 HASH/KEY 等类型。

PARTITION BY RANGE (uid) SUBPARTITION BY HASH (uid % 4) SUBPARTITIONS 2(

PARTITION p0 VALUES LESS THAN (3000000)

DATA DIRECTORY = '/data0/data'

INDEX DIRECTORY = '/data1/idx',

PARTITION p1 VALUES LESS THAN (6000000)

DATA DIRECTORY = '/data2/data'

INDEX DIRECTORY = '/data3/idx'

);

以上例子,对 RANGE 分区再次进行子分区划分,子分区采用 HASH 类型。

二、常见分区操作:

MySQL数据库:分区Partition相关推荐

  1. mysql数据库分区

    日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分 ...

  2. mysql数据库分区-根据时间分区

    一.数据库分区 -- 创建表 CREATE TABLE test_log (time datetime,msg VARCHAR ( 2000 ) -- id INT NOT NULL AUTO_INC ...

  3. 深入理解MySQL——数据库分区

    一.概述 对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成.实现分区的代码实际上是对一组底层表的句柄对象(Handler Object)的封装.对分区表的请求,都会通过句柄对象转化成对 ...

  4. mysql的分区技术作用_理解MySQL数据库分区管理的技术细节

    在MySQL数据库中,表的不同部分在不同的位置被存储为单独的表.分区主要就是用来解决表在不同的位置存储的问题.在其他数据库中,也会存在这种情况.他们将这种类型的数据表称之为分区表.分区的管理,对于My ...

  5. MySQL 表分区 Partition

    MySQL InnoDB,MyISAM, 和 NDB 存储引擎都支持分区. 分区的过程就是将一个表和索引分成多个小的部分:逻辑上讲只有一个表和索引,但实际上由多个物理分区组成. 这点和分表不同,分表实 ...

  6. mysql in partition_MySQL Partition分区扫盲

    MySQL从5.1.3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition: mysql> SHOW VARIABLES LIKE '%partition%'; ...

  7. mysql 不同分区 同时insert_一文看懂mysql数据库分区表概念、类型、适用场景、优缺点及原理...

    概述 最近对项目上部分表按时间做了分区,所以顺便整理下mysql分区表的一些内容,仅供参考. 一.分区表概念 分区是将一个表的数据按照某种方式,比如按照时间上的月份,分成多个较小的,更容易管理的部分, ...

  8. 理解MySQL——并行数据库与分区(Partition)

    1.并行数据库 1.1.并行数据库的体系结构 并行机的出现,催生了并行数据库的出现,不对,应该是关系运算本来就是高度可并行的.对数据库系统性能的度量主要有两种方式:(1)吞吐量(Throughput) ...

  9. MySQL数据库分表分区

    防伪码:当你终于沉默,成熟才刚刚开始. 为什么要分表和分区? 我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且 由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性 ...

  10. mysql数据库建新分区_mysql数据库分区

    日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表和表分 ...

最新文章

  1. 【青少年编程(第24周)】Python-Turtle组队学习结营!
  2. FPGA之道(62)时空变换之空间换时间
  3. mysql的语句分类,查询、子查询及连接查询
  4. python处理excel表格数据-零基础使用Python读写处理Excel表格的方法
  5. Rabbitmq - 配置
  6. java容器类2:Map及HashMap深入解读
  7. 高中同窗被叫“码子”的!如今转行软件测试,不止是年轻,还有拼搏的勇气
  8. Java中的try/catch/finally
  9. 一篇搞定 Redis6(完整版)
  10. 华为路由器配置文件备份与恢复
  11. 微信小程序下载视频保存到本地
  12. linux下geos如何编译,在Linux上用Python模块编译geos3.6.2
  13. 【转】LaTeX 符号命令大全
  14. 一文详解SLAM回环及优化
  15. 高德地图获取坐标距离_计算两个坐标点之间的距离(高德地图)
  16. Aria2一键安装及管理脚本,搭建AriaNg前端
  17. mongodb集群-副本集(CSRS)
  18. 厉害!23岁本科生发14篇SCI论文,并任外审专家……
  19. 永洪bi日志清理配置
  20. java基础(三) IDEA使用与多线程编程

热门文章

  1. 六、Hive中的内部表、外部表、分区表和分桶表
  2. Graphviz使用
  3. 额外篇 | ggplot (上)
  4. opencv 裁剪 java_OpenCV绘制轮廓和裁剪
  5. “悟道”公开课第四讲丨悟道开发案例:​悟空策论——议论文写作平台
  6. 三面百度AI岗,炸了
  7. NeurIPS 2020 | 一种基于动作采样的简单高效的正则化强化学习方法
  8. 从PageRank到反欺诈与TextRank
  9. PW Live直播 | 清华大学NLP组秦禹嘉:基于自然语言解释的数据增强
  10. 深度长文 | 复旦大学肖仰华:领域知识图谱落地实践中的问题与对策