mysql分区表之一:分区原理和优缺点【转】_mysql 为什么讨厌分区-程序员宅基地

技术标签: mysql  分区  

1.分区表的原理

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

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

select查询:

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

insert操作:

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

delete操作:

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

update操作:

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

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

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

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

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

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

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

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

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

3.分区本身也有一些限制:

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

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

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

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

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

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

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

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.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/caojianwei1992/article/details/80923755

智能推荐

(算法)稳定婚姻匹配-程序员宅基地

文章浏览阅读71次。题目:婚介所登记了N位男孩和N位女孩,每个男孩都对N个女孩的喜欢程度做了排序,每个女孩都对N个男孩的喜欢程度做了排序,你作为月老,能否给出稳定的牵手方案?稳定的定义:如果男孩i和女孩a牵手,但男孩i对女孩b更喜欢,而女孩b的男朋友j拼不过男孩i,则没有力量阻碍男孩i和女孩b的私奔,这即是不稳定的。思路: 1962 年,美国数学家 David Gale 和 Lloyd Shapl..._wm[i][woman[i][j]]=j

python基础教程数据分析_Python基础教程之Python数据分析工具总结-程序员宅基地

文章浏览阅读112次。Python主要是依靠众多的第三方库来增强它的数据处理能力的。常用的是Numpy库,Scipy库、Matplotlib库、Pandas库、Scikit-Learn库等。常规版本的python需要在安装完成后另外下载相应的第三方库来安装库文件。而若安装的是Anaconda版本的Python,则不需要一个一个安装第三方库,可能已经同时安装了这些库。Anaconda是专门应用于科学计算的Python版本..._python处理piv教程

CS224n研究热点1 一个简单但很难超越的Sentence Embedding基线方法-程序员宅基地

文章浏览阅读149次。为什么80%的码农都做不了架构师?>>> ..._计算padded的sentence的embedding

苹果id无法登陆_苹果手机无法连接到app store怎么办-程序员宅基地

文章浏览阅读3.6k次。  苹果手机提供了App Store作为官方的软件下载渠道,如果有时候遇到苹果手机无法连接到app store怎么办,下面就为大家介绍一下解决的方法。苹果手机无法连接到app store怎么办  无法连接到App Store一般都是由于网络问题导致的,下面就为大家介绍一下几种解决的方法:  1、首先可以重启一遍手机看一下能否解决;  2、您可以将当前的WiFi断开使用移动网络能否正常打开;  3、..._苹果手机无法连接到app store

数形结合彻底解决2个球100层楼摔坏的问题_两个小球从高空抛下移到100层楼-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏20次。题目:有一栋100层高楼,从某一层开始扔下的玻璃球刚好摔坏,现有两个玻璃球,试用最简便的方法确定这个恰好摔坏玻璃球的那层. 这是一道著名的面试题目,仅写出我的思路和解法. 首先从题目得出基本思路1.第一个球应该低到高试,但不是每层必试.2.不能有侥幸心理,第二个球在第一个球的区间里每层必试. 上图是简化为10层楼解法。 数字代表楼层,球从原点先右后上的路_两个小球从高空抛下移到100层楼

读取HG-S1010测量值 RS485通信 modbus协议 FP7_hg s1010接线-程序员宅基地

文章浏览阅读210次。HG-S1010配有模拟量输出(电压、电流),NPN/PNP输出,也可通过外接通讯模块进行输出。通信模块包括SC-HG1-485模块(RS485接口协议)、SC-HG1-ETC模块(EtherCAT总线)、SC-HG1-C模块(CCLink协议)等。本文介绍连接松下FP7与HG-S1010配RS485通信模块进行通信,通过modbus协议读取HG-S1010当前测量值。主控制器测量值位置在地址H64处,占两个字节。将SC-HG1-485模块与控制器HG-SC101连接,在端子台+、-插入通信用线。_hg s1010接线

随便推点

STM32-串口通信发送+接收信息(标准库+代码)_stm32串口传输代码-程序员宅基地

文章浏览阅读586次,点赞12次,收藏8次。通用异步收发器UART(Universal Asynchronous Receiver/Transmitter),是一种串行、异步、全双工的通信协议。通过发送线(TX)、接收线(RX)、GND就可以进行全双工通信。需要确定好通信双方的波特率(bps指每秒传输的码元数量)串口通信是一位一位地传输,每传输一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平),后面由7位数据位组成,接着是1位校验位,最后是1位停止位。_stm32串口传输代码

lliunx 系统 图片服务器fastdfs 安装和测试_linux测试fastdfs上传图片-程序员宅基地

文章浏览阅读465次。fastdfs 相关安装包下载:fastdfs_client_java_v1.10.tar.gz 下载链接:https://sourceforge.net/projects/fastdfs/fastdfs-nginx-module_v1.16.tar.gz 下载链接:https://sourceforge.net/projects/fastdfs/file_linux测试fastdfs上传图片

VMware虚拟机安装Ubuntu系统步骤详解_虚拟机安装ubuntu下载live dvd还是什么-程序员宅基地

文章浏览阅读1.1w次,点赞15次,收藏101次。Ubuntu是一个以桌面应用为主的Linux操作系统。作为Linux发行版中的后起之秀,Ubuntu Linux在短短几年时间里就成长为从Linux初学者到资深专家都十分青睐的发行版。Ubuntu Linux是开放源代码的自由软件,用户可以登录Ubuntu Linux的官方网址免费下载该软件的安装包。Ubuntu提供了一个健壮、功能丰富的计算环境,既适合家庭使用又适用于商业环境。_虚拟机安装ubuntu下载live dvd还是什么

8 Python Web开发:Django项目实战教程-程序员宅基地

文章浏览阅读1k次。作者:禅与计算机程序设计艺术 1.简介概述在企业级应用软件的开发中,基于Web的后端技术一直占据着很大的市场份额。由于HTML、CSS、JavaScript等Web技术的普及,以及高性能的服务器硬件,使得Web开发成为一种可行的方案。而对于Python来说,作为一种

学python可以创业_学Python后到底能干什么?网友:我太难了-程序员宅基地

文章浏览阅读293次。其实在面邀薪资上,2018年就呈现出了大厂的「集聚效应」,A~C轮中型公司的平均年薪,甚至能被上市公司拉开将近10万的差距,从下图就可以初见端倪。得益于大厂和创业公司的推崇,横向与其他技术岗位相比,Python这样的薪资涨幅也算得上是表现突出。在100offer出具的报告中显示,Python在2018年的平均面邀薪资首度突破了40万大关,同比涨幅在所有技术岗位中排名第三!什么人更适合学Python..._python创业能做什么

mybatis uuid java_请问mybatis新增操作使用UUID 如何返回UUID-程序员宅基地

文章浏览阅读483次。mybatis 在新增的时候并不会返回String类型,请问我如何获取到当前插入的UUID ,debug跟进的时候 看到在selectKey执行产生的UUID并没有set进当前user对象,而是重新产生了一个变量。请问如何解决返回当前对象ID调用持久层前,自己生成一个UUID,放到对象里并且方法返回该UUID。dao接口定义 save 方法 时 尝试 修改返回类型 为String 看看有没有接收到..._idtype.assign_uuid 新增如何返回id

推荐文章

热门文章

相关标签