数据库分区
概述
什么是数据分区
- mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),在innoDB擎中,一张表主要对应着二个文件,一个是frm存放表结构的,一个是ibd 存放数据和索引的。如果一张表的数据量太大的话,那么ibd文件就会变的很大,查找数据就会变的很慢。
- 这个时候我们可以利用mysql的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,我们查找一条数据时,就不用全部查找了,只要知道这条数据在哪一块,然后在那一块找就行了。如果表的数据太大,可能一个磁盘放不下,这个时候,我们可以把数据分配到不同的磁盘里面去。
分区的二种方式
-
横向分区
举例来说明,假如有100W条数据,分成十份,前10W条数据放到第一个分区,第二个10W条数据放到第二个分区,依此类推。也就是把表分成了十分,而表的结构并没有变化。
-
纵向分区
举例来说明,在设计用户表的时候,开始的时候没有考虑好,而把个人的所有信息都放到了一张表里面去,这样这个表里面就会有比较大的字段,分区的时候,可以把这样的大字段,分开来。将一张表变成两张表来处理。
分区类型
Range分区
Range分区最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段,基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。
查看data存放目录
SHOW VARIABLES LIKE '%datadir%';
创建分区
CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`access_time` datetime NOT NULL,
PRIMARY KEY (`id`,`access_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (to_days(access_time))
(PARTITION p1 VALUES LESS THAN (to_days(20190101)) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (to_days(20190102)) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (to_days(20190103)) ENGINE = InnoDB) */;
-- 或者
CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`access_time` datetime NOT NULL,
PRIMARY KEY (`id`,`access_time`)
)
PARTITION BY RANGE (TO_DAYS(access_time) ) (
PARTITION p1 VALUES LESS THAN ( TO_DAYS('20190101') ),
PARTITION p2 VALUES LESS THAN ( TO_DAYS('20190102') ),
PARTITION p3 VALUES LESS THAN ( TO_DAYS('20190103') ),
PARTITION p4 VALUES LESS THAN ( TO_DAYS('20190104') ),
PARTITION p5 VALUES LESS THAN ( TO_DAYS('20190105') ),
PARTITION p6 VALUES LESS THAN ( TO_DAYS('20190106') ),
PARTITION p7 VALUES LESS THAN ( TO_DAYS('20190107') ),
PARTITION p8 VALUES LESS THAN ( TO_DAYS('20190108') ),
PARTITION p9 VALUES LESS THAN ( TO_DAYS('20190109') ),
PARTITION p10 VALUES LESS THAN