分区表的原理

分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个相同的索引,从存储引擎的角度来看,底层表和一个普通表没有任何不同,存储引擎也无须知道这是一个普通表还是一个分区表的一部分。

在分区表上的操作按照下面的操作逻辑进行:

select查询:

当查询一个分区表的时候,分区层先打开并锁住所有的底层表,优化器判断是否可以过滤部分分区,然后再调用对应的存储引擎接口访问各个分区的数据

insert操作:

当写入一条记录时,分区层打开并锁住所有的底层表,然后确定哪个分区接受这条记录,再将记录写入对应的底层表

delete操作:

当删除一条记录时,分区层先打开并锁住所有的底层表,然后确定数据对应的分区,最后对相应底层表进行删除操作

update操作:

当更新一条数据时,分区层先打开并锁住所有的底层表,mysql先确定需要更新的记录在哪个分区,然后取出数据并更新,再判断更新后的数据应该放在哪个分区,然后对底层表进行写入操作,并对原数据所在的底层表进行删除操作

虽然每个操作都会打开并锁住所有的底层表,但这并不是说分区表在处理过程中是锁住全表的,如果存储引擎能够自己实现行级锁,如:innodb,则会在分区层释放对应的表锁,这个加锁和解锁过程与普通Innodb上的查询类似。

在下面的场景中,分区可以起到非常大的作用:

A:表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他都是历史数据

B:分区表的数据更容易维护,如:想批量删除大量数据可以使用清除整个分区的方式。另外,还可以对一个独立分区进行优化、检查、修复等操作

C:分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备

D:可以使用分区表来避免某些特殊的瓶颈,如:innodb的单个索引的互斥访问,ext3文件系统的inode锁竞争等

E:如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好

F:优化查询,在where字句中包含分区列时,可以只使用必要的分区来提高查询效率,同时在涉及sum()和count()这类聚合函数的查询时,可以在每个分区上面并行处理,最终只需要汇总所有分区得到的结果。

分区本身也有一些限制:

A:一个表最多只能有1024个分区(mysql5.6之后支持8192个分区)

B:在mysql5.1中分区表达式必须是整数,或者是返回整数的表达式,在5.5之后,某些场景可以直接使用字符串列和日期类型列来进行分区(使用varchar字符串类型列时,一般还是字符串的日期作为分区)。

C:如果分区字段中有主键或者唯一索引列,那么所有主键列和唯一索引列都必须包含进来,如果表中有主键或唯一索引,那么分区键必须是主键或唯一索引

D:分区表中无法使用外键约束

E:mysql数据库支持的分区类型为水平分区,并不支持垂直分区,因此,mysql数据库的分区中索引是局部分区索引,一个分区中既存放了数据又存放了索引,而全局分区是指的数据库放在各个分区中,但是所有的数据的索引放在另外一个对象中

F:目前mysql不支持空间类型和临时表类型进行分区。不支持全文索引

子分区的建立需要注意以下几个问题:

A:每个子分区的数量必须相同

B:只要在一个分区表的任何分区上使用subpartition来明确定义任何子分区,就必须在所有分区上定义子分区,不能漏掉一些分区不进行子分区。

C:每个subpartition子句必须包括子分区的一个名字

D:子分区的名字必须是唯一的,不能在一张表中出现重名的子分区

E:mysql数据库的分区总是把null当作比任何非null更小的值,这和数据库中处理null值的order by操作是一样的,升序排序时null总是在最前面,因此对于不同的分区类型,mysql数据库对于null的处理也各不相同。对于range分区,如果向分区列插入了null,则mysql数据库会将该值放入最左边的分区,注意,如果删除分区,分区下的所有内容都从磁盘中删掉了,null所在分区被删除,null值也就跟着被删除了。在list分区下要使用null,则必须显式地定义在分区的散列值中,否则插入null时会报错。hash和key分区对于null的处理方式和range,list分区不一样,任何分区函数都会将null返回为0.

mysql 不同分区 同时insert_Mysql分区表的原理和优缺点相关推荐

  1. mysql 字符串分区_Mysql分区表的原理和优缺点

    分区表的原理 分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分区表 ...

  2. mysql表分区的使用和底层原理

    什么是分区表 MySQL从5.1版本开始支持分区功能, 分区是将一个表的数据按照某种方式,比如按照时间上的月份,分成多个较小的,更容易管理的部分,但是逻辑上仍是一个表. 还没出现分区表的时候,所有的数 ...

  3. oracle分区exchange,oracle 分区表exchange原理

    oracle分区的exchange操作非常快,那原理是什么呢?下面我们来做个实验: SQL> create table test (id number(3)); 表已创建. SQL> in ...

  4. mysql 交换分区吗_MySQL分区表——交换分区

    从MySQL 5.6开始,支持分区交换.就是将一个分区表中的一个分区和一个普通表中的数据互换.一.实现交换分区的基本语法:ALTER TABLEptEXCHANGE PARTITIONpWITH TA ...

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

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

  6. mysql 分区表优化_Sql优化之Mysql表分区

    一  分区表适用于以下场景 1:表非常大以至于无法全部放在内存中,或者只在标的最后部分有热点数据,其他均是历史数据 2:分区表的数据更容易维护.例如想批量删除大量数据可以使用清除整个分区的方式.另外还 ...

  7. mysql表分区备份_ZRM 2.1:备份MySQL分区表

    ZRM 2.1:备份MySQL分区表 MySQL 5.1通常可供生产使用. MySQL 5.1的主要功能之一就是分区. 表分区可以帮助提高性能和可用性. 表可以根据范围(给定范围内的列值),列表(匹配 ...

  8. zabbix mysql 表分区_5-Zabbix系统MySQL数据库分区表的设定--精简说明

    当zabbix监控的服务器数量越来越多,就会报"Zabbix housekeeper processes more than 75% busy"这个错误,机器数量多的时候,mysq ...

  9. mysql按照时间自动创建分区表_mysql 表分区、按时间函数分区、删除分区、自动添加表分区...

    mysql 表分区的几种方式: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进 ...

最新文章

  1. 二叉树 2.0 -- 非递归遍历
  2. 【Linux】Linux简单操作之文件管理
  3. Vware Workstation pro 12|虚拟机
  4. 网络宣传推广教大家网站的过期页面更合理的处理方法
  5. springboot-24-restTemplate的使用
  6. CALL FUNCTION START NEW TASK
  7. 你担心大家会滥用的全局变量,大家(包括你自己)一定会滥用
  8. python pandas 拿取表格中两个列_在家憋着也是憋着,不如来学习一下python数据聚合的方法...
  9. 苹果CMSv10自适应高权重模板源码
  10. openpyxl 列 插入_openpyxl 基本使用
  11. Nginx SSI指令配置详解
  12. java载入器材_JAVA之了解类载入器Classloader
  13. html5做在线音乐,html5实现在线响应式音乐播放器
  14. Java旅游管理系统本科生毕业设计开题报告
  15. PID公式的推导过程及实现代码
  16. 计算机主机需要ccc,计算机电脑需要做3c认证吗?
  17. 停止dockerd进程
  18. Python TypeError: cat() takes no arguments
  19. 三国大时代java_横跨,塞班、安卓、pc的国产良心作《三国大时代》系列
  20. 在windows环境下可以直接运行的word2vec.c 并带有详细注释

热门文章

  1. Python查找指定文件
  2. ironic如何支持部署时按需RAID?
  3. MySql(18)——Linux MySQL主从配置
  4. centos6虚拟机复制后修改网卡
  5. .net生成随机字符串
  6. Java(Android)线程池
  7. Android之 Fragment
  8. 64位centOS5.4系统安装memcached
  9. zookeeper入门系列
  10. [Java核心技术(卷I)] - vscode手动编译运行继承类