【面试宝典】19道分库分表高频题库整理(附答案背诵版)

简述为什么要分库 ?

分库的原因主要有以下几点:

  1. 提升数据库性能:当单表数据量太大时,会严重影响SQL执行的性能。一般单表到达几百万的时候,性能就会相对差一些了,这时就得分表。分表就是把一个表的数据放到多个表中,然后查询的时候只查一个表。
  2. 减少数据库压力:大量请求阻塞或SQL操作变慢时,可以通过分库分表来减少数据库的压力,提升数据库响应速度,缩短查询时间。
  3. 提升可扩展性:随着业务的发展,单库的并发值达到上限时,就需要进行扩容。分库可以将一个库的数据拆分到多个库中,访问的时候就访问一个库好了。

简述为什么要分表 ?

分表的原因主要有以下几点:

  1. 提升查询性能:当单表数据量太大时,查询性能会下降。通过分表,可以将数据分散到多个表中,减少单个表的查询压力,从而提高查询性能。
  2. 提升并发能力:分表可以将数据分散到多个数据库或服务器上,从而增加系统的并发处理能力。
  3. 方便数据维护:分表可以将数据按照某种规则或业务逻辑进行划分,使得数据维护更加方便。

总之,分表是为了解决单表数据量过大导致的问题,提升数据库性能和并发处理能力,方便数据维护。

解释什么时候考虑分库分表?

考虑分库分表的情况通常是在数据库出现瓶颈时,例如:

  1. 大量请求阻塞:在高并发场景下,大量请求都需要操作数据库,导致连接数不够了,请求处于阻塞状态。
  2. SQL操作变慢:如果数据库中存在一张上亿数据量的表,一条SQL没有命中索引会全表扫描,这个查询耗时会非常久。
  3. 存储出现问题:业务量剧增,单库数据量越来越大,给存储造成巨大压力。

如何分库分表 ?

分库分表的方法主要有两种:水平拆分和垂直拆分。

水平拆分是将一个表中的数据按照某种业务特征划分,将不同业务特征的字段放入同一张表中,将该表拆分为若干张表,就是垂直分表。从某种层面来看,这就是数据库表设计层面上的逻辑拆分。

垂直分库是将不同业务特征的表,按照业务特征进行划分,不同业务特征的表放入不同的数据库中。简单的来讲就是订单相关的表放入订单数据库,产品相关的表放入产品数据库中。

简述什么是数据库垂直切分 ?

数据库垂直切分是根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。 比如说一个新零售的电商数据库,可以把跟商品相关的数据表拆分成一个数据库,然后在这些数据表的基础之上,构建出商品系统。然后把跟进销存相关的数据表拆分到另外一个数据库上,再用程序构建出仓库系统。

简述什么是数据库水平切分 ?

数据库水平切分是将一个表中的记录按照某种规则分布到不同的数据库或数据库实例中,以达到分散负载、提高性能和可扩展性的目的。水平切分是一种常见的数据库优化技术,可以有效解决单表数据量过大导致的问题。

例如,如果一个大型的在线购物网站有一个订单表,每天都会插入大量的订单数据。我们可以将这个订单表拆分为多个小表,例如按日期拆分,每天一个表。这样,每天的订单数据都可以分散存储在多个表中,减轻了单个表的压力。同时,我们还可以根据订单的状态进行进一步的拆分,例如已支付、未支付、已发货等状态。这样可以根据查询需求的不同,快速定位到相应的表进行查询。

请问什么是一定规则 ?

在数据库水平切分中,一定规则是指将数据按照某种特定的规则或条件进行拆分,以实现数据的分散存储和查询负载的均衡。这个规则可以根据业务需求和数据特点来确定,例如按照某个字段的取模值、哈希值、范围等进行拆分。

例如,如果一个在线购物网站的订单表按照日期进行水平切分,那么每个订单的日期都会被取模,根据取模结果将订单数据分散存储在多个表中。这样,每个表只包含一部分订单数据,减轻了单个表的压力,提高了查询性能和可扩展性。

总之,一定规则是数据库水平切分的关键,需要根据实际情况来确定合适的规则,以达到最佳的拆分效果。

请详细解释分库分表规则的取模算法 ?

取模算法是分库分表规则中的一种常见算法,用于将数据按照某种规则进行拆分。在取模算法中,首先需要确定一个模数,通常是数据库实例数或子表数量。然后,对需要拆分的字段进行取模运算,得到余数。根据余数的值,将数据分散存储到不同的数据库或子表中。
以订单表为例,假设订单表中有一个订单编号字段,我们想要按照订单编号进行拆分。首先,我们可以将数据库实例数或子表数量设定为N。然后,对订单编号字段进行取模运算,得到余数i。根据余数的值,将订单数据分别存储在N个数据库实例或子表中,其中i=0的订单数据存储在第一个数据库实例或子表中,i=1的订单数据存储在第二个数据库实例或子表中,以此类推。

取模算法的优点是可以实现数据的均匀分布,避免请求都打到一个库上的情况。同时,查询时可以使用相同的规则,通过订单编号作为查询条件快速定位到数据。然而,当某一台机器宕机时,本应该落在该数据库的请求就无法得到正确的处理,这时宕掉的实例会被踢出集群,此时算法变成hash(userId) mod N-1,用户信息可能就不再在同一个库中了。

总之,取模算法是一种常见的分库分表规则算法,可以实现数据的均匀分布和快速查询定位。但在实际应用中需要注意一些问题,如机器宕机时的处理等

请详细解释分库分表规则的范围限定算法 ?

范围限定算法是分库分表规则中的另一种常见算法,用于将数据按照某个字段的范围进行拆分。

在范围限定算法中,首先需要确定拆分范围和拆分规则。通常,可以根据某个字段的范围进行拆分,例如按照日期、时间戳、ID范围等进行拆分。

以订单表为例,假设订单表中有一个订单创建时间字段,我们想要按照订单创建时间进行拆分。首先,我们可以确定拆分的时间范围,例如每天、每小时或每分钟等。然后,根据拆分的时间范围,将订单数据分别存储在不同的数据库或子表中。

例如,如果按照每天进行拆分,我们可以将订单表中每个订单的创建时间字段进行取模运算,得到余数i。根据余数的值,将订单数据分别存储在N个数据库实例或子表中,其中i=0的订单数据存储在第一个数据库实例或子表中,i=1的订单数据存储在第二个数据库实例或子表中,以此类推。

范围限定算法的优点是可以实现数据的均匀分布和快速查询定位。同时,可以根据业务需求灵活调整拆分范围和规则。然而,当某个时间范围内的数据量非常大时,可能会导致单个数据库或子表压力过大,影响性能和可扩展性。

总之,范围限定算法是一种常见的分库分表规则算法,可以实现数据的均匀分布和快速查询定位。但在实际应用中需要注意一些问题,如数据量过大的处理等。

数据库分库后,事务问题如何解决 ?

数据库分库后,事务问题是一个需要特别关注的问题。在传统的单一数据库中,事务是保证数据一致性和完整性的重要机制。但是,在分库分表的环境下,事务的执行会涉及到多个数据库或子表,因此需要采取一些措施来解决事务问题。

一种常见的解决方法是使用分布式事务。分布式事务可以保证在多个数据库或子表之间的事务一致性和原子性。常见的分布式事务解决方案有基于两阶段提交、分布式事务框架等。这些方案可以确保在多个数据库或子表之间的事务操作要么全部成功,要么全部失败,从而保证了数据的一致性和完整性。

另外,也可以通过使用流水表来解决事务问题。在分库分表的环境下,可以将操作数据库的逻辑映射为一条流水记录,将整个大事务执行完毕后(流水被插入到流水表),再通过其他方式来执行这段流水,保证最终一致性。流水表可以理解为一条事务消息,通过在数据库中创建一张流水表,使用一条流水记录代表一个业务处理逻辑,因此,一个流水一定是能最终正确执行的。

需要注意的是,在分库分表的环境下,事务的延迟处理性和处理无序性也需要特别关注。如果事务是实时处理的,需要考虑后续流程对流水的依赖性;如果事务是异步处理的,需要保证即使后生成的流水先执行,也不能出现问题。同时,需要保证流水最终的成功性,避免出现事务失败的情况。

总之,数据库分库后的事务问题需要采取一些措施来解决,包括使用分布式事务、流水表等方案。同时需要注意事务的延迟处理性和处理无序性等问题,以保证数据的一致性和完整性。

由于内容太多,更多内容以链接形势给大家,点击进去就是答案了

11. 详细阐述数据库中间件对比 ?

12. 为了避免数据热点问题如何选择分表策略 ?

13. 简述分表要停服嘛?不停服怎么做?

14. 简述如何评估分库数量 ?

15. 列举目前主流的分库分表中间件 ?

16. 如何生成全局唯一的分布式ID ?

17. 简述分库分表后的分页问的处理方案 ?

18. 分库分表之后order by,group by等聚合函数处理方案 ?

19. 阐述分表之后跨节点Join关联问题 ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值