数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈,需要进行数据的处理,采用的手段是分区、分片、分库、分表。
1)分库
业务拆分 - 如顾客,商品,订单各自分独立的库
主备 - 主机做读写,备机只做数据备份
主从(读写分离) - 主机写,从机读
主主 - 任意一台机做写,互相复制
集群 - 一主多备、一主多从、多主多从,主机写,所有机都可以读
1)分片(类似分库)
分片是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。
Shard这个词的意思是“碎片”。
如果将一个数据库当作一块大玻璃,将这块玻璃打碎,那么每一小块都称为数据库的碎片(DatabaseShard)。
将整个数据库打碎的过程就叫做分片,可以翻译为分片。
形式上,分片可以简单定义为将大数据库分布到多个物理节点上的一个分区方案。每一个分区包含数据库的某一部分,称为一个片,分区方式可以是任意的,并不局限于传统的水平分区和垂直分区。
一个分片可以包含多个表的内容甚至可以包含多个数据库实例中的内容。每个分片被放置在一个数据库服务器上。
一个数据库服务器可以处理一个或多个分片的数据。
系统中需要有服务器进行查询路由转发,负责将查询转发到包含该查询所访问数据的分片或分片集合节点上去执行。
2)分表
分表从表面意思说就是把一张表分成多个小表。
1)垂直分表 - 列数太多的大表分成多张表,分后表的结构变了,列数变少,表保存数据的行数不变
2)水平分表 - 表保存数据的行数太多的表分到多张表去保存,分后表的结构不变,表保存数据的行数变少。
分区和分表的区别与联系
分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。
分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。
当访问量大,且表数据比较大时,两种方式可以互相配合使用。
当访问量不大,但表数据比较多时,可以只进行分区。
常见分区分表的规则策略(类似)
Range(范围)
Hash(哈希)
按照时间拆分
Hash之后按照分表个数取模
在认证库中保存数据库配置,就是建立一个DB,这个DB单独保存user_id到DB的映射关系
3)分区
数据分区是一种物理数据库的设计技术,它的目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
分区并不是生成新的数据表,而是将表的数据均衡分摊到不同的硬盘,系统或是不同服务器存储介子中,实际上还是一张表。
另外,分区可以做到将表的数据均衡到不同的地方,提高数据检索的效率,降低数据库的频繁IO压力值,分区的优点如下:
相对于单个文件系统或是硬盘,分区可以存储更多的数据;
数据管理比较方便,比如要清理或废弃某年的数据,就可以直接删除该日期的分区数据即可;
精准定位分区查询数据,不需要全表扫描查询,大大提高数据检索效率;
可跨多个分区磁盘查询,来提高查询的吞吐量;
在涉及聚合函数查询时,可以很容易进行数据的合并;
mysql5 开始支持分区功能
CREATE TABLE sales (
id INT AUTO_INCREMENT,
amount DOUBLE NOT NULL,
order_day DATETIME NOT NULL,
PRIMARY KEY(id, order_day)
) ENGINE=Innodb
PARTITION BY RANGE(YEAR(order_day)) (
PARTITION p_2010 VALUES LESS THAN (2010),
PARTITION p_2011 VALUES LESS THAN (2011),
PARTITION p_2012 VALUES LESS THAN (2012),
PARTITION p_catchall VALUES LESS THAN MAXVALUE);
常用分库分表中间件
sharding-JDBC
MyCAT
Atlas
来源:oschina
链接:https://my.oschina.net/lion1220/blog/4263629