分库分表

10 分钟阅读 1158 字 + 336 词
MySQL 分库分表的好处就像把一个大仓库拆分成若干个小仓库一样,比如你有一家超市,里面有很多商品,但是这些商品分类很杂,放在一个仓库里可能很混乱,而且也不容易查找。如果把这个仓库拆分成好几个仓库,比如有食品仓库、服装仓库、电子产品仓库,这样就很容易找到想要的商品,同样的道理,MySQL 分库分表也是这样,把大的数据库拆分成若干个小的数据库,把大表按照合适的分表策略拆分成多个具有独立存储空间的小表,拆分后的小表可以存储在同一个数据库,也可以分散在不同数据库中。这样就能更好的管理数据(例如改善数据库的备份和恢复性能)增加可用性和安全性,提高数据访问(包括查询和读写)效率。
分库分表是一种常用的数据库扩展方案,它将一个大的数据库或大表按照不同的规则进行切分,将数据分散到多个数据库实例或表中,以提高数据库的性能和可扩展性。
分库分表通常包括 垂直分表、垂直分库、水平分库、水平分表四种方案。
垂直分表:
是将一个大数据表按数据列(字段)的维度进行拆分(分成多个表,每个表存储其中一部分字段)。垂直分表适用于数据表列数过多、列之间关联较小的场景。它带来的提升是: 1、 减少了 IO 冲突和锁表的几率。例如:查看商品详情的用户与浏览商品信息的用户互不影响。 2、 充分发挥热数据的操作效率 ,例如:商品信息的操作的高效率不会被商品描述信息(BLOG:二进制类型数据,存储图片、视频等或 TEXT:长文本类型数据)访问的低效率所拖累。
垂直分库:
是将一个大型数据库中的数据 按照业务模块进行拆分 ,将不同的业务模块分配到不同的数据库上。它的核心理念是 专库专用 。它带来的提升是: 1、 解决业务层面的耦合,业务清晰 。 2、能对不同业务的数据进行分级管理、维护、监控、扩展等。 3、 高并发场景下,垂直分库一定程度的提升 IO、减少数据库连接数、降低单机硬件资源的瓶颈。
垂直分库适用于业务模块复杂、 数据表之间关联较小 的场景,每个库可以部署在不同的服务器上,从而达到多个服务器共同分摊压力的效果,但是依然没有解决单表数据量过大的问题。当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平分库了。
水平分库:
是将一个大型数据库依据一定规则, 按数据行的维度进行切分 ,将数据行分配到不同的数据库上,每个库可以部署在不同的服务器上。水平分库是对数据行的拆分,不影响表结构。它带来的提升是: 1、 解决了单库数据量大和高并发的性能瓶颈 。 2、提高了系统的稳定性及可用性。 稳定性提升体现在 IO 冲突减少,锁定减少 ,可用性指如果某个库出问题,数据库仍部分可用。
经过水平切分的优化,往往能解决单库存储量及性能瓶颈。但由于同一个表被分配在不同的数据库,需要额外进行数据操作的路由工作,因此大大提升了系统复杂度。
水平分表:
是将一个大表按照数据行的维度进行拆分,将数据行分配到不同的数据表中。水平分表适用于数据表行数过多、数据访问量分散的场景。
它带来的提升是: 1、 优化单一表数据量过大而产生的性能问题 2、 避免 IO 争抢并减少锁表的几率
库内的水平分表,解决了单一表数据量过大的问题,分出来的小表中只包含一部分数据,从而使得单个表的数据量变小,提高检索性能。