一天一道面试题——数据库篇8(分表分库)

为什么要分表分库

数据量大了,使用多个读写分离,多个从库也无法解决查询性能问题时,需要对数据进行切分。

垂直切分

垂直分表

也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。 一般是针对那种几百列的大表,也避免查询时,数据量太大造成的“跨页”问题。

垂直分库

垂直分库针对的是一个系统中的不同业务进行拆分。

优点:

  • 业务解耦,逻辑清晰
  • 在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈

缺点:

  • 部分表无法join,需要业务接口解决
  • 分布式事务
  • 无法解决单表数据量大的情况

水平切分

水平分表

针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。不建议采用。

水平分表分库

将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。

优点

  • 可以减少单表的数据量,利于扩展
  • 缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈

缺点

  • 查询需要带上分区键
  • 无法join
  • 查询合并

切分方案

  • 按照键值哈希,常见的是userid
  • 按照日期
  • RANGE
  • 地理区域

开源中间件

  • mycat
  • shardingsphere

你可能感兴趣的:(一天一道面试题——数据库篇8(分表分库))