热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

【MySQL】分库分表相关思考

一、分库分表概念1.分库随着业务的增长,数据量的增加,很多接口响应时间变得很长,经常出现Timeout,而且通过升级MyS


一、分库分表概念

在这里插入图片描述


1. 分库

随着业务的增长,数据量的增加,很多接口响应时间变得很长,经常出现 Timeout,而且通过升级 MySQL 实例配置已经无法解决问题了,这时候就要分库。

垂直分库:将不同的业务表分在不同的数据库中。

水平分库:水平分库理论上切分起来是比较麻烦的,它是将同一表数据拆分到不同数据库实例中。


2. 分表

分表的应用场景是单表数据量增长速度过快,因为大表会影响查询性能,DDL变更时间很长,影响业务的可用性,同时导致从库延迟很大。但是 MySQL 实例的负载并不高,这时候只需要分表,不需要分库。

垂直分表:表中的字段太多,需要切分字段,一般将不常用的、 数据较大、长度较长的拆分到“扩展表“。

水平分表:单表数据量太大,按某种规则将单表数据拆分到多张表中。从理论上突破了单机数据量的瓶颈,是分库分表的标准解决方案。


二、分片策略

1. 取模分片

比如按主键ID取模,将数据存储到不同的分片中。


  • 优点:数据存放比较均匀。
  • 缺点:扩容需要大量数据迁移。

2. 按范围分片

比如按日期范围进行分片。


  • 优点:扩容不需要迁移数据。
  • 缺点:数据存放不均匀,容易产生数据倾斜。

3. 自定义分片

根据业务场景,灵活定制分片策略

分片策略的选取需要考虑如何不迁移数据,实现集群动态扩缩容,同时又能保证数据分布相对均匀。可以采用整体按范围分片,不同范围包含的分片数可以不同,保证扩容时老数据不需要迁移。范围内,按照取模分片,让每个范围内的数据分布大致均匀。


三、是否应该分库分表

以下只是建议,不是绝对的要求。


  • 预估数据量:阿里建议3年内单表数据量大于500w或者单表数据文件大于2G,就需要考虑分库分表。
  • 数据增长趋势:持续高速增长的数据需要尽早考虑分库分表,并且要预留空间。
  • 预估应用场景:由于频繁变更分片键,需要同时做数据迁移,所以,对于分片键变更频繁的数据,不适合进行分库分表。
  • 预估业务复杂度:业务逻辑与分片逻辑绑定,会给SQL执行带来很多限制。所以如果对数据的查询逻辑变化非常大,通常不建议分库分表。

四、分库分表面临的问题
  • 主键唯一性:当数据被拆分到不同的表中后,主键ID将可能不再满足唯一性。
  • 分布式事务:分库分表后,就需要支持分布式事务了。数据库本身为我们提供了事务管理功能,但是分库分表之后就不适用了。如果我们自己编程协调事务,代码方面就又开始了麻烦。
  • SQL路由:一条数据插入SQL应该插入到哪个表?这个问题与选取的分片策略息息相关。
  • 结果归并:由于查询的数据可能存在于多张表、多个库中,所以需要对查询结果做归并处理。
  • 动态扩容:当数据又增长到一定阈值时,就需要考虑扩容,如何实现在不迁移或者少迁移数据的基础上实现动态扩容?
  • 联合查询困难:联合查询不仅困难,而且可以说是不可能,因为两个相关联的表可能会分布在不同的数据库,不同的服务器中。
  • 多数据源:分库分表之后可能会面临从多个数据库或多个子表中获取数据,一般的解决思路有:客户端适配和代理层适配。






推荐阅读
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • SQL 连接详解与应用
    本文详细介绍了 SQL 连接的概念、分类及实际应用,包括内连接、外连接、自连接等,并提供了丰富的示例代码。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 通过使用Sqoop导入工具,可以精确控制并高效地将表数据的特定子集导入到HDFS中。具体而言,可以通过在导入命令中添加WHERE子句来指定所需的数据范围,从而在数据库服务器上执行相应的SQL查询,并将查询结果高效地存储到HDFS中。这种方法不仅提高了数据导入的灵活性,还确保了数据的准确性和完整性。 ... [详细]
  • B站服务器故障影响豆瓣评分?别担心,阿里巴巴架构师分享预防策略与技术方案
    13日晚上,在视频观看高峰时段,B站出现了服务器故障,引发网友在各大平台上的广泛吐槽。这一事件导致了连锁反应,大量用户纷纷涌入A站、豆瓣和晋江等平台,给这些网站带来了突如其来的流量压力。为了防止类似问题的发生,阿里巴巴架构师分享了一系列预防策略和技术方案,包括负载均衡、弹性伸缩和容灾备份等措施,以确保系统的稳定性和可靠性。 ... [详细]
  • 在当今的软件开发领域,分布式技术已成为程序员不可或缺的核心技能之一,尤其在面试中更是考察的重点。无论是小微企业还是大型企业,掌握分布式技术对于提升工作效率和解决实际问题都至关重要。本周的Java架构师实战训练营中,我们深入探讨了Kafka这一高效的分布式消息系统,它不仅支持发布订阅模式,还能在高并发场景下保持高性能和高可靠性。通过实际案例和代码演练,学员们对Kafka的应用有了更加深刻的理解。 ... [详细]
author-avatar
兔斯基小兔子_988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有