@[toc] 松哥之前写过文章跟大家介绍过用 MyCat 实现 MySQL 的分库分表,不知道有没有小伙伴研究过,MySQL 其实也自带了分区功能,我们可以创建一个带有分区的表,而且不需要借助任何外部工具,今天我们就一起来看看。
1. 什么是表分区
小伙伴们知道,MySQL 数据库中的数据是以文件的形势存在磁盘上的,默认放在 /var/lib/mysql/
目录下面,我们可以通过 show variables like '%datadir%';
命令来查看:
我们进入到这个目录下,就可以看到我们定义的所有数据库了,一个数据库就是一个文件夹,一个库中,有其对应的表的信息,如下:
在 MySQL 中,如果存储引擎是 MyISAM,那么在 data 目录下会看到 3 类文件:.frm
、.myi
、.myd
,作用如下:
*.frm
:这个是表定义,是描述表结构的文件。*.myd
:这个是数据信息文件,是表的数据文件。*.myi
:这个是索引信息文件。
如果存储引擎是 InnoDB
, 那么在 data 目录下会看到两类文件:.frm
、.ibd
,作用分别如下:
*.frm
:表结构文件。*.ibd
:表数据和索引的文件。
无论是哪种存储引擎,只要一张表的数据量过大,就会导致 *.myd
、*.myi
以及 *.ibd
文件过大,数据的查找就会变的很慢。
为了解决这个问题,我们可以利用 MySQL 的分区功能,在物理上将这一张表对应的文件,分割成许多小块,如此,当我们查找一条数据时,就不用在某一个文件中进行整个遍历了,我们只需要知道这条数据位于哪一个数据块,然后在那一个数据块上查找就行了;另一方面,如果一张表的数据量太大,可能一个磁盘放不下,这个时候,通过表分区我们就可以把数据分配到不同的磁盘里面去。
MySQL 从 5.1 开始添加了对分区的支持,分区的过程是将一个表或索引分解为多个更小、更可管理的部分。对于开发者而言,分区后的表使用方式和不分区基本上还是一模一样,只不过在物理存储上,原本该表只有一个数据文件,现在变成了多个,每个分区都是独立的对象,可以独自处理,也可以作为一个更大对象的一部分进行处理。
需要注意的是,分区功能并不是在存储引擎层完成的,常见的存储引擎如 InnoDB
、MyISAM
、NDB
等都支持分区。但并不是所有的存储引擎都支持,如 CSV
、FEDORATED
、MERGE
等就不支持分区,因此在使用此分区功能前,应该对选择的存储引擎对分区的支持有所了解。
2. 分区的两种方式
不同于 MyCat 中既可以垂直切分又可以水平切分,MySQL 数据库支持的分区类型为水平分区,它不支持垂直分区。
2.1 水平切分
先来一张简单的示意图,大家感受一下什么是水平切分:
假设我的 DB 中有 table-1、table-2 以及 table-3 三张表,水平切分就是拿着我 40 米大刀,对准黑色的线条,砍一剑或者砍 N 剑!
砍完之后,将砍掉的部分放到另外一个数据库实例中,变成下面这样ÿ