目录

mysql之分区

李羽秋
李羽秋 2023年02月09日  ·  阅读 1,099

mysql之分区

1.为什么要分区

在Mysql中,如果存储引擎是MyISAM,那么在data目录下会看到3类文件: .frm、.myi、.myd,作用如下:

  • *.frm: 这个是表定义,是描述表结构的文件
  • *.myd: 这个是数据信息文件,是表的数据文件
  • *.myi: 这个是索引信息文件

无论是哪种存储引擎,只要一张表的数据量过大,就会导致*.myd, * .myi , *.ibd文件过大,数据的查找就会变得很慢。

为了解决这个问题,我们利用mysql分区功能,在物理上将这一张表对应的文件,分割成许多小块,如此,当我们查找一条数据时,就不用在某个文件中进行整个遍历了,我们只需要这条数据位于哪个数据块,然后在那个数据块上查找就行了;另一方面,如果一张表的数据量太大,可能一个磁盘放不下,这个时候,通过表分区我们就可以把数据分配到不同的磁盘里面去。

2.分区的两种方式

不同于Mycat中既可以垂直切分又可以水平切分,Mysql数据库支持的分区类型为水平分区,它不支持垂直分区

2.1 水平分区

image-20220330183121680

假设我的 DB 中有 table-1、table-2 以及 table-3 三张表,水平切分就是拿着我 40 米大刀,对准黑色的线条,砍一剑或者砍 N 剑!

砍完之后,将砍掉的部分放到另外一个数据库实例中,变成下面这样:

image-20220330183132682

这样,原本放在一个 DB 中的 table 现在放在两个 DB 中了,观察之后我们发现:

  1. 两个 DB 中表的个数都是完整的,就是原来 DB 中有几张表,现在还是几张。
  2. 每张表中的数据是不完整的,数据被拆分到了不同的 DB 中去了。

这就是数据库的水平切分,也可以理解为按照数据行进行切分,即按照表中某个字段的某种规则来将表数据分散到多个库之中,每个表中包含一部分数据,即水平切分不改变表结构。

2.2 垂直分区

先来一张简单的示意图,感受一下垂直切分:

image-20220330183237487

所谓的垂直切分就是拿着我 40 米大刀,对准了黑色的线条砍。砍完之后,将不同的表放到不同的数据库实例中去,变成下面这个样子:

image-20220330183311900

3.分区的优点

  • 可以让单表存储更多的数据。
  • 分区表的数据更容易维护,可以通过清除整个分区批量删除大量数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作。
  • 部分查询能够从查询条件确定只落在少数分区上,查询速度会很快。
  • 分区表的数据还可以分布在不同的物理设备上,从而高效利用多个硬件设备。
  • 可以使用分区表来避免某些特殊瓶颈,例如 InnoDB 单个索引的互斥访问、ext3 文件系统的 inode 锁竞争。
  • 可以备份和恢复单个分区。

4.分区的局限

  • 一个表最多只能有 1024 个分区。
  • 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。
  • 分区表无法使用外键约束。
  • NULL 值会使分区过滤无效。
  • 所有分区必须使用相同的存储引擎。

转载:https://juejin.cn/post/7079781551415754782

分类: mysql
标签: