MySQL 分表,分区(一)

MySQL 分表,分区

分表又分横向拆分(水平分表)【表结构一样,数据不一样】
纵向拆分(垂直分表)【表结构不一样,数据不一样】

什么是分表?
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。

什么是分区?
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。

mysql分表和分区有什么联系呢?
1.都能提高mysql的性高,在高并发状态下都有一个良好的表现。

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

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

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

分表的几种方式:
1、mysql集群
它并不是分表,但起到了和分表相同的作用。集群可分担数据库的操作次数,将任务分担到多台数据库上。集群可以读写分离,减少读写压力。从而提升数据库性能。

2、自定义规则分表
大表可以按照业务的规则来分解为多个子表。通常为以下几种类型,也可自己定义规则。

Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。

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

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

List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。

Composite(复合模式) –以上模式的组合使用

3、利用merge存储引擎来实现分表
merge分表,分为主表和子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。

mysql分区介绍

mysql5.1开始支持数据表分区,mysql的分区技术不同之前的分表技术,它与水平表有点类似,但是它在逻辑层进行的水平分表,对与应用程序而言它还是一张表,
mysql分区类型:

  • range 分区:基于属于一个给定连续区间的列值,把多行分配给分区

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

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

  • key分区:类似于按hash分区,区别在于key分区只支持计算一列或多列,且mysql服务器提供其自身的哈希函数

  • columns分区(mysql5.5):解决了5.5版本之前range分区和list分区只支持整数分区字段必须是整型或者必须转换为整型的限制。

     上面的RANGE、LIST、HASH、KEY四种分区中,分区的条件必须是整形,如果不是整形需要通过函数将其转换为整形。
     
     mysql-5.5开始支持COLUMNS分区,可视为RANGE和LIST分区的进化,COLUMNS分区可以直接使用非整形数据进行分区。
     
      COLUMNS分区支持以下数据类型:
     所有整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL则不支持。
     日期类型,如DATE和DATETIME。其余日期类型不支持。
     字符串类型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT类型不支持。
     	  COLUMNS可以使用多个列进行分区。
    

【注意:在5.1版本中,range分区,list分区,hash分区都要求分区键必须是int类型或者通过表达式返回int类型,唯一例外的就是key分区,可以使用其他类型的列(blob和text除外)做为分区键】
【注意:无论哪种分区,要么你分区表上没有主键/唯一键,要么分区表的主键/唯一键都必须包含分区键,也就是说不能使用主键/唯一键字段之外的其它字段分区。】
【注意:分区名不区分大小写】

分区的优点:

  1. 与单个磁盘或文件系统分区相比,可以存储更多的数据。
  2. 对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据
  3. 优化查询。在where子句中包含分区条件时,可以只扫描必要的一个或者多个分区来提高查询效率;同时在涉及sum()和count()这类聚合函数的查询时,可以容易的在每个分区上并行处理,最终只需要汇总所有分区得到的结果
  4. 通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量

分区应该注意的事项:

  1. 做分区时,要么不定义主键,要么把分区字段加入到主键中
  2. 分区字段不能为NULL,要不然怎么确定分区范围呢,所以尽量NOT NULL
-- 查看mysql版本
select version();

-- 查看分区插件是否激活 partition active
show plugins;

对于低版本的MySQL,如果InnoDB引擎要想分区成功,需要在my.conf中设置innodb_file_per_table=1 设置成独立表空间
独立表空间:每张表都有对应的.ibd文件
innodb_file_per_table=1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值