分表和分库是什么?有什么区别?
分库是一种水平扩展数据库的技术,将数据根据一定规则划分到多个独立的数据库中。每个数据库只负责存储部分数据,实现了数据的拆分和分布式存储。分库主要是为了解决并发连接过多,单机 mysql扛不住的问题。
分表指的是将单个数据库中的表拆分成多个表,每个表只负责存储一部分数据。这种数据的垂直划分能够提高查询效率,减轻单个表的压力。分表主要是为了解决单表数据量太大,导致查询性能下降的问题。
分库与分表可以从:垂直(纵向)和 水平(横向)两种纬度进行拆分。下边我们以经典的订单业务举例,看看如何拆分。
垂直分库:一般来说按照业务和功能的维度进行拆分,将不同业务数据分别放到不同的数据库中,核心理念 专库专用。按业务类型 对数据分离,剥离为多个数据库,像订单、支付、会员、积分相关等表放在对应的订单库、支付库、会员库、积分库。垂直分库把 一个库的压力分摊到多个库,提升了一些数据库性能,但并没有解决由于单表数据量过大导致的性能问题,所以就需要配合后边的 分表来解决。
垂直分表:针对业务上字段比较多的大表进行的,一般是把业务宽表中比较独立的字段,或者不常用的字段拆分到单独的数据表中,是一种大表拆小表的模式。数据库它是以行为单位将数据加载到内存中,这样拆分以后核心表大多是访问频率较高的字段,而 且字段长度也都较短,因而可以加载更多数据到内存中,减少磁盘IO,增加索引查询的命中率,进一步提升数据库性能。
水平分库:是把同一个表按一定规则拆分到不同的数据库中,每个库可以位于不同的服务器上,以此实现水平扩展,是一种常见的 提升数据库性能的方式。这种方案往往能解决单库存储量及性能瓶颈问题,但由于同一个表被分配在不同的数据库中,数据的访问 需要额外的路由工作,因此系统的复杂度也被提升了。
水平分表:是在同一个数据库内,把一张大数据量的表按一定规则,切分成多个结构完全相同表,而每个表只存原表的一部分数据。水平分表尽管拆分了表,但子表都还是在同一个数据库实例中,只是解决了单一表数据量过大的问题,并没有将拆分后的表分。
常见的分库分表工具:
1. Sharding-JDBC
基于方式:
Sharding-JDBC是一个轻量级的Java框架,它通过JDBC驱动的方式,透明化地支持分库分表。它主要是基于AOP原理,在webapp本地进行SQL的拦截、解析、改写、路由和结果归集处理。
优点:
-
效率高,因为它在本地应用层重写jdbc原生的方法,实现数据库分片形式。
-
可以在不改变现有代码的情况下进行数据库水平扩展。
缺点:
-
需要修改代码,对应用入侵性比较强。
2. Sharding-Proxy
基于方式:
Sharding-Proxy作为数据库代理服务,提供MySQL、PostgreSQL和SQLServer等多种协议的支持。它对外表现为一个完整的数据库服务器,能够接受标准的SQL语句并路由到后端的真实数据库。
优点:
-
支持多种数据库协议,可以作为一个独立的数据库服务存在。
-
降低了客户端的改造成本。
缺点:
-
相比Sharding-JDBC,可能存在一些性能损耗,因为它需要在代理层进行SQL的解析和路由。
3. MyCat
基于方式:
MyCat是一款开源的分布式数据库中间件,它主要通过改写SQL分发,以保证数据的安全。MyCat基于Proxy,将MyCat server伪装成一个MySQL数据库,通过它来管理后端的真实数据库。
优点:
-
跨语言、跨平台、跨数据库的能力强,支持多种数据库的分库分表和读写分离。
-
可以通过代码直连数据库,灵活性高。
缺点:
-
生态还并不是很完善,很多内容都在开发中。
-
相比ShardingSphere,其社区支持和功能完善度可能稍逊一筹。
4. Apache ShardingSphere
基于方式:
Apache ShardingSphere是一个生态圈,主要由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这三款相互独立但又能够混合部署配合使用的产品组成。它提供了全面的分库分表、读写分离、分布式事务等解决方案。
优点:
-
功能全面,支持多种数据库和分片策略。
-
社区活跃,有问题可以方便地询问和得到支持。
-
提供了灵活的部署方式,可以根据项目需求选择合适的组件进行混合使用。
缺点:
-
相比轻量级的Sharding-JDBC,ShardingSphere的复杂度和学习成本可能稍高。
-
作为组件存在,需要集成在应用内,意味着作为使用方,必须要集成到代码里,使得开发成本相对较高。
总结
在选择分库分表工具时,需要根据项目的具体需求、技术栈以及团队的技术能力进行综合考虑。每种工具都有其独特的优点和适用场景,选择合适的工具可以大大提升项目的开发效率和系统性能。