从字面上简单理解,就是将本来存储在一个库的数据分块存储在多个库上,将本来存储在一个表的数据分块存储在多个表里面。前端
数据的切分根据其切分规则的类型,能够分为以下两种切分模式。数据库
这样操做的优势:设计模式
拆分后业务清晰,拆分规则明确。
系统之间进行整合或扩展很容易。
按照成本、应用的等级、应用的类型等将表放到不一样的机器上,便于管理。
便于实现动静分离、冷热分离的数据库表的设计模式。
数据维护简单。
复制代码
缺点:性能
业务表多样,SQL语句复杂。
复制代码
水平(横向)切分:根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上。与垂直切分对比,水平切分不是将表进行分类,而是将其按照某个字段的某种规则分散到多个库中,在每一个表中包含一部分数据,全部表加起来就是全量的数据。学习
好比有一个用户表,单张表的记录条数达到1亿条,这样在进行查询,插入,更新操做的时候,速度将很是慢,那咱们能够将这些数据分配到100个表里面,每一个表的数据量就下来了,致使单表的容量不会太大,从而保证了单表的查询等处理能力。spa
咱们一般将数据分配的原则称为分片规则,常见的分片规则有对用户的id取模。设计
注意:必定要好好决定分片规则,尽可能选择不会变更的字段,若是选择区域,性别,年龄等字段,当用户修改这些信息的时候又要讲数据移动到其余数据库,这里面的逻辑也很头疼。3d
这样操做水平的优势以下:code
单库单表的数据保持在必定的量级,有助于性能的提升。
切分的表的结构相同,应用层改造较少,只须要增长路由规则便可。
提升了系统的稳定性和负载能力。
复制代码
缺点以下:cdn
切分后,数据是分散的,很难利用数据库的Join操做,跨库Join性能较差。
拆分规则难以抽象。
分片事务的一致性难以解决。
数据扩容的难度和维护量极大。
复制代码
数据库负载增大时的处理:随着咱们的应用的用户量愈来愈大,访问量也随之提高,当他们提高到必定的量级以后,应用也就愈来愈慢。固然咱们能够经过增大前端应用负载的方式来提高速度,可是直到有一天咱们发现不管如何增大前端应用负载都不能提高速度,咱们就逐步找到缘由,是数据库的问题。由于数据库是存在性能瓶颈的,这是没法避免的。
MyCat:是一个中间件的第三方应用,使用mycat时不须要改代码。 咱们在使用的时候,若是有多个库,咱们在代码里面就只要写mycat对外的一个逻辑库信息就行,而数据库层面的配置,好比总共有多少个库,每一个库里面的表,每一个表的分片规则,这些都是在mycat里面配置,不须要修改代码信息。 具体的逻辑图以下:
Sharding JDBC:是一个jar包,使用sharding-jdbc时须要修改代码。 咱们在使用的时候,须要引入sharding jdbc的jar包,在配置文件里面写明总共有多少个库,每一个库里面的表,每一个表的分片规则等信息。
具体的逻辑图以下:
如何选择中间件?
sharding-jdbc和mycat使用不一样的理念,sharding-jdbc目前是基于jdbc驱动,无需额外的proxy,所以也无需关注proxy自己的高可用。Mycat 是基于 Proxy,它复写了 MySQL 协议,将 Mycat Server 假装成一个 MySQL 数据库,而 Sharding-JDBC 是基于 JDBC 接口的扩展,是以 jar 包的形式提供轻量级服务的。
其实MyCAT很适合中小企业使用的。能够很是容易的实现数据库的读写分离和分库分表,反而对于大企业来讲,都会本身开发适合本身的数据库中间层应用,好比sharding jdbc原来就是当当网内部的数据库中间件,后来开源出来的。