一天一道面试题——数据库篇8(分表分库)
2022-02-22 本文已影响0人
猿哥媛姐
为什么要分表分库
数据量大了,使用多个读写分离,多个从库也无法解决查询性能问题时,需要对数据进行切分。
垂直切分
垂直分表
也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。 一般是针对那种几百列的大表,也避免查询时,数据量太大造成的“跨页”问题。
垂直分库
垂直分库针对的是一个系统中的不同业务进行拆分。
优点:
- 业务解耦,逻辑清晰
- 在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈
缺点:
- 部分表无法join,需要业务接口解决
- 分布式事务
- 无法解决单表数据量大的情况
水平切分
水平分表
针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。不建议采用。
水平分表分库
将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。
优点
- 可以减少单表的数据量,利于扩展
- 缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈
缺点
- 查询需要带上分区键
- 无法join
- 查询合并
切分方案
- 按照键值哈希,常见的是userid
- 按照日期
- RANGE
- 地理区域
开源中间件
- mycat
- shardingsphere