MySQL分表分区是解决大数据量导致MySQL性能低下的两种方法。

什么是MySQL分表

从表面意思上看,MySQL分表就是将一个表分成多个表,数据和数据结构都有可能会变。MySQL分表分为垂直分表和水平分表。

1、垂直分表

垂直分表是按表中的字段来划分的,如下图所示。

在上图中,我们将本来分布在同一张表中的C1、C2、C3、C4四个字段垂直划分到两个表中。第一张表中分布C1、C3、C4三个字段,第二张表中分布C1、C2两个字段。拆分后的两个表通过C1这个共同的字段关联起来。

2、水平分表

水平分表是按表中的记录来划分的。如下图所示。

在上图中,我们将本来分布在同一张表中的四条记录,水平拆分到两个表中。第一张表中,分布两条记录;第二张表中,分布两条记录。

3、分表操作

MySQL分表既可以自定义规则,也可以使用业内通用规则,还可以使用merge存储引擎来实现。

1)自定义规则

按照用户或业务的编号分表。对与用户或业务可以按照编号%n,进行分成n表。

按照日期分表。对于日志或统计类等的表。可以按照年,月,日,周分表。

2)使用Merge存储引擎

使用Merge存储引擎实现MySQL分表比较适合那些没有事先考虑分表,随着数据的增多,已经出现了数据查询慢的情况。使用Merge存储引擎实现MySQL分表可以避免改代码。使用Merge实现MySQL分表可以按如下形式操作:

在上图中,ENGINE = MERGE表示,使用merge引擎。另外ENGINE = MRG_MyISAM是一样的意思。UNION = (user1, user2)表示,挂接了user1、user2表,INSERT_METHOD = LAST表示插入方式:0不允许插入,FIRST插入到UNION中的第一个表,LAST插入到UNION中的最后一个表。

使用Merge存储引擎实现MySQL分表,分表后的结果会分为主表和子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。如下图所示。

上图是对user表进行merge分表的结果,alluser是总表,user1和user2是分表。每一个表都有自己的表结构,子表而且还保存了数据和索引,总表没有保存数据和索引,总表只保存了分表的关系,以及插入数据的方式。

4、分表查询

对于分表后的查询操作,依然是联合查询,视图等基本操作,或者使用merge引擎合并数据并在此表中查询。复杂一些操作需要借助存储过程来完成,借助外部工具实现对分表的管理。如:

  • 垂直分表的使用join连接、水平分表的使用union连接。

  • 对于使用Merge存储引擎实现的MySQL分表,可以直接查询总表。

5、注意事项

1)重复记录 / 重复索引

若建立Merge表前,分表t1 / t2已经存在,并且t1 / t2中存在重复记录。查询时,遇到满足记录的条目就会返回。意思就是只会显示一条记录,同时不会报错。若建立Merge表后,insert / update时,出现重复索引,则会提示错误。MERGE表只对建表之后的操作负责。

2)如何删除一个分表

不能直接删除一个分表,这样会破坏Merge表。正确的方法是:

alter table t ENGINE = MRG_MyISAM UNION = (t1) INSERT_METHOD = LAST;

drop table t1;

3)误删Merge总表

误删Merge表,是不会造成数据丢失的,只需重新创建总表。

什么是MySQL分区

从表面意思看,MySQL分区就是将一张表的数据分成多个存储区块,而数据结构不变。另外,这些存储区块既可以在同一个磁盘上,也可以在不同的磁盘上。如下图所示。

上图是对表aa进行分区后,磁盘上的文件分布。从图中我们可以看到,分区后aa表的数据结构没有发生变化,而数据和索引存储的位置由原来的一个变成了两个。另外,多出了一个.par文件,打开.par文件后你可以看出他记录了这张表的分区信息。

1、分区操作

MySQL从5.1.3开始支持Partition,你可以使用如下命令来确认你的版本是否支持Partition:

MySQL支持的分区类型包括Range、List、Hash、Key,其中Range比较常用:

1)Range(范围) – 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区,80年代(1980's)的数据,90年代(1990's)的数据以及任何在2000年(包括2000年)后的数据。如下:

在这里,将用户表分成4个分区,以每300万条记录为界限,每个分区都有自己独立的数据、索引文件的存放目录。

2)List(预定义列表) – 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如:DBA根据用户的类型进行分区。

3)Key(键值) – 上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

4)Hash(哈希) – 这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区,。例如DBA可以建立一个对表主键进行分区的表。

2、注意事项

1)以上每一种分区方式,都可以将这些分区所在的物理磁盘分开完全独立,以提高磁盘IO吞吐量。如下:

上图就是对Range(范围)分区类型进行物理空间的分离操作。

2)分区虽然很爽,但目前的实现还有很多限制:

  • 主键或者唯一索引必须包含分区字段:如PRIMARY KEY(i,created)。

  • 很多时候,使用了分区就不要再使用主键,否则可能影响性能。

  • 只能通过int类型的字段或者返回int类型的表达式来分区:通常使用YEAR或TO_DAYS等函数。

  • 每个表最多1024个分区:不可能无限制的扩展分区,而且过度使用分区往往会消耗大量系统内存。

  • 采用分区的表不支持外键:相关的约束逻辑必须通过程序来实现。

MySQL分表和分区的异同

  1. 都能提高mysql的性高,在高并发状态下都有一个良好的表现。

  2. 分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。

  3. 分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。

  4. 表分区相对于分表,操作方便,不需要创建子表。

MySQL的分表与分区的更多相关文章

  1. MySql分库分表与分区的区别和思考

    一.分分合合 说过很多次,不要拘泥于某一个技术的一点,技术是相通的.重要的是编程思想,思想是最重要的.当数据量大的时候,需要具有分的思想去细化粒度.当数据量太碎片的时候,需要具有合的思想来粗化粒度. ...

  2. mysql的分表与分区的区别

    http://www.2cto.com/database/201503/380348.html

  3. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  4. mysql分表,分区的区别和联系

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  5. Mysql分表和分区的区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  6. 什么是分表和分区 MySql数据库分区和分表方法

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

  7. MySQL 分表和分区

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

  8. MYSQL分表与分区

    什么是分表分区分表分区的区别实现方式上数据处理上提高性能上实现的难易度上mysql分表和分区的联系如何分区概述分区技术支持分区类型及举例注意应用场景示例订单表比预想中扩张速度快坑爹的日志表每半月一个分 ...

  9. Mysql分表和分区的区别、分库分表介绍与区别(转)

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

随机推荐

  1. Linux文件属性之Linux文件删除重要原理详解

    Linux下文件删除的原理 只要dongdaxiafile(源文件).服务进程.dongdaxiaflie_hard_link(硬链接文件)三个中的任意一个存在文件不会被删除.

  2. 学习笔记:html学习之一:html基本标记

    1. 概论 一个完整的 HTML 文档必须包含 3 个部分: 一个由 元素定义的文档版本信息. 一个由 定义各项声明的文档头部, 作为各种声明信息的包含元素出现在文档的顶端,并且要先于 出现. 一个由 ...

  3. Centos7 安装部署 Airflow

    本人在centos7 的环境下部署,怎么在centos7 下配置静态 IP 关闭防火墙 以及安装jdk在这里不多赘述, centos7 配置静态ip可以参考:https://www.cnblogs.c ...

  4. 20190507-学习dubbo有感于梁飞

    “作为一名程序员,BAT肯定是大多数人都想进的,仿佛是一种情愫,就像学生时代的我们对清华北大的向往感觉一样.Dubbo团队中,其中主要负责人就是梁飞了,梁飞的经历还是蛮励志的.梁飞,花名虚极, 200 ...

  5. [SDOI2013]直径 题解

    题面 这道题明显的一定要找到直径的具体路径,所以两遍dfs是比较好的选择: 第一问是一道弱智题吧? 主要难度全部分摊在了第二问: 其实不难,先找到任意一个直径: 对于任意一个在直径上的点: 设nxt[ ...

  6. 深入应用C++ 11 C2

    template<typename T> void print(T& t) { cout << "lvalue" << endl; } ...

  7. [经验分享] Docker网络解决方案-Weave部署记录

    前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用.当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来.容器在不同主机之间都使用的 ...

  8. Jmeter之Plugin插件,服务器监控

    Jmeter Plugins插件 我在测试工作中:主要使用了监听器中的图表报告和监控服务器CPU,内存(这篇博文就是对插件的安装,以及jmeter怎么监控服务器CPU~) 1.下载安装Plugins插 ...

  9. docker CMD 和 ENTRYPOINT 区别

    昨天用Dockerfile来启动mongodb的集群,启动参数--replSet死活没执行,最后就决定研究一哈cmd和entrypoint.但是上网看了一些资料个人觉得讲的不好,还是没有说出根本的东西 ...

  10. Scala学习十——特质

    一.本章要点 类可以实现任意数量的特质 特质可以要求实现它们的类具备特定的字段,方法或超类 和Java接口不同,Scala特质可以提供方法和字段实现 当你将多个特质叠加在一起时,顺序很重要——其方法先 ...