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 水平分区
假设我的 DB 中有 table-1、table-2 以及 table-3 三张表,水平切分就是拿着我 40 米大刀,对准黑色的线条,砍一剑或者砍 N 剑!
砍完之后,将砍掉的部分放到另外一个数据库实例中,变成下面这样:
这样,原本放在一个 DB 中的 table 现在放在两个 DB 中了,观察之后我们发现:
- 两个 DB 中表的个数都是完整的,就是原来 DB 中有几张表,现在还是几张。
- 每张表中的数据是不完整的,数据被拆分到了不同的 DB 中去了。
这就是数据库的水平切分,也可以理解为按照数据行进行切分,即按照表中某个字段的某种规则来将表数据分散到多个库之中,每个表中包含一部分数据,即水平切分不改变表结构。
2.2 垂直分区
先来一张简单的示意图,感受一下垂直切分:
所谓的垂直切分就是拿着我 40 米大刀,对准了黑色的线条砍。砍完之后,将不同的表放到不同的数据库实例中去,变成下面这个样子:
3.分区的优点
- 可以让单表存储更多的数据。
- 分区表的数据更容易维护,可以通过清除整个分区批量删除大量数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作。
- 部分查询能够从查询条件确定只落在少数分区上,查询速度会很快。
- 分区表的数据还可以分布在不同的物理设备上,从而高效利用多个硬件设备。
- 可以使用分区表来避免某些特殊瓶颈,例如 InnoDB 单个索引的互斥访问、ext3 文件系统的 inode 锁竞争。
- 可以备份和恢复单个分区。
4.分区的局限
- 一个表最多只能有 1024 个分区。
- 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。
- 分区表无法使用外键约束。
- NULL 值会使分区过滤无效。
- 所有分区必须使用相同的存储引擎。
分类:
mysql
标签:
无