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;
相关文章推荐
- mysql-binlog日志恢复数据库
- mysql delete删除记录数据库空间不减少问题解决方法
- mySQL 增量备份方案(转)
- 【MySQL】探究之null与not null
- MySQL安装(Windows)
- Mysql的基础整理
- 2016-2-21mysql笔记
- 自己如何正确获取MYSQL的ADO连接字符串
- mysql学习笔记(1)
- win7下安装mysql
- mysql 服务启动error:1067错误
- 学习mysql比较好一些书籍
- mysql-5.7.11-winx64.zip 安装配置
- mysql - 汇总函数
- mysql Access denied for user 'root'@'localhost' (using password: YES)
- MySQL连接查询
- 关于mysql5.7.11的使用
- MySQL单表查询
- mysql 读写分离
- MySQL使用变量实现部分分组聚合