什么情况下分库?分表?分库分表?
作者:程序员马丁
在线博客:https://open8gu.com
note
大话面试,技术同学面试必备的八股文小册,以精彩回答应对深度问题,助力你在面试中拿个offer。
回答话术
1. 什么场景下分表?
当出现以下三种情况的时候,我们需要考虑分表:
- 单个表的数据量过大。
- 数据量一般但是其中单个字段文本过大,比如包含了 Text 或者 LongText 字段。
- 数据库表对应的磁盘文件过大。
2. 什么场景下分库?
当出现以下两种情况时,我们需要考虑通过分库来将数据分散到多个数据库实例上,以提升整体系统的性能:
- 当单个数据库支持的连接数已经不足以满足客户端需求。
- 数据量已经超过单个数据库实例的处理能力。
不过,如果仅仅是并发超过单个数据库自身瓶颈场景,可以优先考虑使用读写分离,减少分库带来的复杂性。
3. 什么场景下分库又分表?
当出现以下两种场景下,需要进行分库又分表:高并发写入和海量数据:
- 高并发写入场景:当应用面临高并发的写入请求时,单一数据库可能无法满足写入压力,此时可以将数据按照一定规则拆分到多个数据库中,每个数据库处理部分数据的写入请求,从而提高写入性能。
- 海量数据场景:随着数据量的不断增加,单一数据库的存储和查询性能可能逐渐下降。此时,可以将数据按照一定的规则拆分到多个表中,每个表存储部分数据,从而分散数据的存储压力,提高查询性能。
问题详解
1. 多少数据量进行分表?
单表 1000w 是否要分表?这个问题明显是不对的,没有对应到具体场景,回答不够标准。
假设一个表里 15 个字段,没有特别大的值(不包含 text 或其它超长度的列)数据量超过 5000 万了,依然很丝滑,因为走索引。
在实际业务中,真正需要考虑的是:业务的增长量以及历史数量。
2. 物理文件过大,会有什么问题?
会影响公司对数据库表的一个备份。数据库表文件过大,也间接证明表数据过大,增加或删除字段导致锁表的时间过长。
3. 为什么说连接不够用?
假设 MySQL Server 能支持 4000 个数据库连接。我们有 10 个服务,40 个节点,一个节点呢数据库连接池最多 10 个。这样就把一个 MySQL Server 的连接数压榨干净了。
当 MySQL 连接不够用时,可能会报错 Too many connections
或者类似的错误。这是因为 MySQL 服务器同时可以处理的连接数量是有限制的,当连接数达到这个限制时,服务器就会拒绝新的连接请求,并返回这个错误消息。