一架梯子,一头程序猿,仰望星空!
MySQL性能优化面试题 > 内容正文

什么是MySQL分库分表?有几种分库分表策略?


问题简答

MySQL分库分表是指将一个大的MySQL数据库拆分成多个小的MySQL数据库,并且在每个小的MySQL数据库中,将原本存储在单一表中的数据拆分成多个表进行存储。通过这种方式,可以解决单一数据库的容量、并发、性能等瓶颈问题,提高系统的扩展性、可用性和稳定性。

问题详解:

1.分库分表策略

1.1.垂直分库

按照业务进行分库,将不同的业务数据存储在不同的库中,提高数据库安全性、降低风险,同时还可以根据业务需求进行不同库的读写操作。

1.2.水平分库

按照某个字段(如用户ID、订单ID等)对数据进行水平划分,将相同字段值的数据放到同一个库中,可以减轻单个库的压力,提高数据库性能。

1.3.垂直分表

将一张大表按照字段进行拆分,将不同字段的数据存储在不同的表中,提高数据库读写性能,同时可以减少单个表的数据量,避免表的过度膨胀。

1.4.水平分表

将一张大表按照某个字段(如用户ID、订单ID等)进行水平拆分,将相同字段值的数据存储在同一张表中,可以提高数据库性能,减轻单个表的负载。

2.支持分库分表的中间件

通过中间件实现分库分表,下面是支持分库分表的中间件:

2.1.ShardingSphere

ShardingSphere是一个开源的分布式数据库中间件,提供了分片(分库分表)、读写分离、数据加密等功能,支持主流的关系型数据库,如MySQL、Oracle、SQLServer、PostgreSQL等。ShardingSphere提供了两个版本,一个是Sharding-JDBC,专注于JDBC层的分片,另一个是Sharding-Proxy,提供透明化的数据库代理服务,可以在无需修改任何应用程序代码的情况下,实现数据分片。

2.2.MyCAT

MyCAT是一款开源的高性能分布式数据库系统,支持MySQL。它提供了完善的分库分表解决方案,支持水平拆分和垂直拆分,支持数据分片和数据路由等功能。

2.3.Vitess

Vitess是一个开源的分布式数据库中间件,最初由Youtube开发。它为大规模互联网公司提供了一个高可用、可扩展、易于维护的关系型数据库解决方案。Vitess使用Sharding来分割表格数据并将其存储在不同的节点上,从而实现了分布式数据库的功能。它支持多种数据库作为后端存储,包括MySQL、PostgreSQL和CockroachDB。Vitess提供了很多功能,如自动垂直拆分、负载均衡、自动故障恢复、在线扩容等。

3.手动实现分库分表

除了使用中间件,也可以自己写代码根据自定义的分库分表策略,路由SQL读写请求到不同的数据库。

3.1.简单的水平分库例子

例如存在一个订单表order,想把订单数据根据订单ID(order_id),把订单数据分散到db1、db2、db3、db4 4个数据库。

分库规则如下:

  1. order_id % 4 = 0 的订单存储在db1中。
  2. order_id % 4 = 1 的订单存储在db2中。
  3. order_id % 4 = 2 的订单存储在db3中。
  4. order_id % 4 = 3 的订单存储在db4中。

关于订单表的读写,必须携带order_id,然后根据order_id的分库规则计算使用那个数据库。不同的业务场景根据实际情况会选择不同的分库分别规则,这里根据求余的方式计算目标库,只是一个简单的例子。

提示:实际业务订单id不会是数据库自增id,通常是通过雪花算法之类的id生成算法生成。