您的位置:首页 > 数据库 > MySQL

MySQL分表、分区

2016-02-21 23:02 621 查看

1. 什么是分表、分区?

分表(你自己的设计 - 提高并发)

分表是将一个大表(指存储了百万级乃至千万级条记录的表)按照一定的规则分解成多张具有独立存储空间的子表。程序读写表数据时可以根据建表时定好的规则而知道应该查询的表名,继而去操作相应的字表。

分区(MySQL的设计 - 提高I/O)

分区是将一个表的数据分段在多个位置存放,表还是那一张表,但是DB会依据自定义的条件去组织分区的数据。查询时DB会依据分区的结果自动去相应的分区中查询。

2. 为什么要分表、分区?

我们在日常开发中不可避免的会遇到大表的情况,这样的表过于庞大,导致进行数据库查询和更新时耗时太长,性能下降,如果有联合查询那么性能会更糟糕。分区和分表的目的就是减少数据库的负担。

3. 分表、分区的联系和选择?

分表是物理上拆分表,而分区是将一张表在逻辑上进行水平分割。(分表提高并发)

对于访问量不大,但是表数据很多的表,可以采用分区。(MySQL提出分区主要想提高磁盘I/O)

对于访问量大且数据多的表,可以采取分表和分区结合的方式

4. 怎么分表?

1. 自定义规则的分表

垂直分割

就是将一个表按照字段来分,每张表保证有相同的主键就好。一般来说,将常用字段和大字段分表来放。



优势:比没有分表来说,提高了查询速度,降低了查询结果所用内存

劣势:没有解决大量记录的问题,对于单表来说随着记录增多,性能还是下降很快

水平分割

水平拆分就是大表按照记录分为很多子表



hash、自增id取模

对某个字段进行hash来确定创建几张表,并根据hash结果存入不同的表

按时间

根据业务可以按照天、月、年来进行拆分

按每个表的固定记录数

一般按照自增ID进行拆表,一张表的数据行到了指定的数量,就自动保存到下一张表中。比如规定一张表只能存1-1000个记录。

将老数据迁移到一张历史表

比如日志表,一般只查询3个月之内的数据,对于超过3个月的记录将之迁移到历史子表中。

2. MySQL集群

集群不是分表,但是集群起到了和分表相同的作用,分散承担了数据操作,而且可以做读写分离,减少读写压力。

3. 利用merge存储引擎实现分表

不实用

分表需要注意的问题:

1. 查询时要根据预定义规则查询不同的子表;

2. select/update/delete时极有可能涉及多张表,必须在程序逻辑上的事务中都包括好所有的表。

5. 怎么分区?

水平分区

几种模式

Range:定义范围来分

Hash:定义Hash来分

Key:Hash的一种延伸

List(预定义列表):自己定义几个值来分

Composite(复合模式):对1234组合使用

垂直分区

一般将大text和BLOB列分到另一个区

语法

CREATE TABLE part_table
(
c1 int default NULL,
c2 varchar(30) default NULL,
c3 date default NULL
) engine=myisam
PARTITION BY RANGE (year(c3))
(
PARTITION p0 VALUES LESS THAN (1995),
PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,
PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) ,
PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) ,
PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,
PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),
PARTITION p11 VALUES LESS THAN MAXVALUE
);


对比正常语法

create table no_part_table
(
c1 int(11) default NULL,
c2 varchar(30) default NULL,
c3 date default NULL
) engine=myisam;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: