热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高性能Mysql——分区表详解

文章目录分表和分区分表和分区的区别分表和分区联系呢分区表分区方式分区管理分区表注意事项分表和分区分表MySQL的分表是真正的分表,一张表分成很多表后,


文章目录

  • 分表和分区
    • 分表和分区的区别
    • 分表和分区联系呢
  • 分区表分区方式
  • 分区管理
  • 分区表注意事项


分表和分区

分表
MySQL 的分表是真正的分表,一张表分成很多表后,每一个小表都是完整的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

分区
一张大表进行分区后,它还是一张表,不会变成多张表,但是存放数据的区块变多了。


分表和分区的区别

实现方式上
a) mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个 .MYD数据文件,.MYI索引文件,.frm表结构文件

[root@BlackGhost test]# ls |grep user alluser.MRG alluser.frm user1.MYD user1.MYI user1.frm user2.MYD user2.MYI user2.frm

简单说明一下,上面的分表呢是利用了merge存储引擎(分表的一种),alluser是总表,下面有二个分表,user1,user2。他们二个都是独立的表,取数据的时候,我们可以通过总表来取。这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据,数据都放在分表里面

我们来看看.MRG到底是什么东西

[root@BlackGhost test]# cat alluser.MRG |more user1 user2 #INSERT_METHOD=LAST

从上面我们可以看出,alluser.MRG里面就存了一些分表的关系,以及插入数据的方式。可以把总表理解成一个外壳,或者是联接池。

b) 分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了。

[root@BlackGhost test]# ls |grep user
user#P#p1.MYD
user#P#p1.MYI
user#P#p2.MYD
usera#P#p2.MYI
user.frm
user.par

我们都知道一张表对应三个文件.MYD,.MYI,.frm。分区呢根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.par文件,打开.par文件后你可以看出他记录了,这张表的分区信息,根分表中的.MRG有点像。分区后,还是一张,而不是多张表。

数据处理上
a) 分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。看下面的例子: select * from alluser where id='12'表面上看,是对表alluser进行操作的,其实不是的。是对alluser里面的分表进行了操作。

b) 分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。

提高性能上
a) 分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。

b) mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。 在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。

实现的难易度上
a) 分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。
b) 分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。


分表和分区联系呢


  1. 都能提高mysql的性高,在高并发状态下都有一个良好的表面。
  2. 分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。

分区表分区方式

HASH分区

HASH分区的一大特点就是可以更平均的将数据分散到各个分区中,不会像RANGE分区一样数据可能会集中在一个分区中。HASH分区简单来说是基于取模运算结果进行的分区。HASH分区分为常规分区和线性分区。但是常规分区在分区管理上过于麻烦,所以我们一般使用线性分区。

CREATE TABLE C (ID INT NOT NULL,NAME VARCHAR(20),SEX VARCHAR(20))PARTITION BY LINEAR HASH (ID) PARTITIONS 4;

KEY分区
KEY分区和HASH分区类似,不过KEY分区只支持服务器提供的HASH函数,HASH分区只支持整数,KEY分区支持除BLOB ,Text类型外的其他类型作为分区键。

RANGE分区
按照RANGE分区的表示利用取值范围将数据分成区,区间是连续且不能相互叠加的。
RANGE分区一般用作日志归档,并按照时间来进行分区

CREATE TABLE B(ID INT NOT NULL,NAME VARCHAR(30),JOB VARCHAR(30),TIME DATE NOT NULL DEFAULT '1998-01-01')PARTITION BY RANGE(YEAR(TIME))(PARTITION P0 VALUES LESS THAN(1999),PARTITION P1 VALUES LESS THAN(2000),PARTITION P2 VALUES LESS THAN(2001));

LIST分区
LIST分区和RANGE分区比较相似,不过LIST是以一个集合的形式建立分区的。使用LIST分区建立表的操作如下:

Columns分区
Columns分区是mysql5.5以后加入的,用来解决mysql5.1以前的RANGE和LIST分区只支持整数分区,造成的需要进行函数换算得到的整数值。Columns分区包括RANGE Columns和LIST Columns。同时支持整数,时间,字符串三大类型。
利用Columns分区,我们上边RANGE的按时间进行分区的表就可以不添加时间转换函数。具体操作如下:

CREATE TABLE B(ID INT NOT NULL,NAME VARCHAR(30),JOB VARCHAR(30),TIME DATE NOT NULL DEFAULT '1998-01-01')PARTITION BY RANGE COLUMNS(TIME)(PARTITION P0 VALUES LESS THAN('1999'),PARTITION P1 VALUES LESS THAN('2000'),PARTITION P2 VALUES LESS THAN('2001'));

分区管理

删除分区:

ALTER TABLE A DROP PARTITION P2;

以上语句从表A中删除了P2分区,删除分区后,分区内的数据也会被删除。
在RANGE分区中,再次加入原属于分区P2的数据时,会插入到P3分区内。但在LIST分区中,由于删除的是一个指定的集合,所以再次插入属于此集合的数据时会因找不到分区而出错。

加入分区:

ALTER TABLE A ADD PARTITION (PARTITION P3 VALUES LESS THAN (40));

以上语句在A中添加了p3分区,数值为小于40。在RANGE分区中,只能在分区列表的最大一端添加分区。但在LIST中可以添加在任意地方,不过新建的分区不能包括已有分区包含的元素

转移分区(归档)

ALTER TABLE A exchange PARTITION P1 WITH TABLE ARCH_A;

另外归档的ARCH_A表可以使用归档引擎archieve,归档引擎的好处是比INNODB所占的空间更小,但是只允许读操作,不允许写操作。

ALTER TABLE ARCH_A ENGINE=ARCHIEVE

分区表注意事项


  1. 结合业务场景选择分区方式。
  2. 避免跨分区查询。
  3. 对分区表进行查询最好在WHERE从句中包含分区键(避免跨分区扫描)。
  4. 具有主键或者唯一索引的表,主键或唯一索引必须是分区键的一部分。

推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
author-avatar
我爱大树茶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有