为什么要分库分表(数据库层面如何设置)?
用过哪些分库分表中间件?
不同的分库分表中间件有什么优点和缺点?
具体是如何对数据库进行垂直拆分和水平拆分?
面试官心里分析
这里扯到了高并发 因为分库分表是为了支撑高并发 数据量大两个问题的 分库分表是最普遍的技术问题
为什么要分库分表 (设计高并发系统的时候 数据库层面该如何设计)
说明白了 分库分表是两回事 可以光分库不分表 也可以是光分表不分库
分表
单表数量太大 会极大的的影响sql执行的性能 到了后面的sql可能就跑的很慢 单表到了几百万的时候 性能就会相对差一些了 所以要考虑分表 就是把一个表的数据放到多个表中 然后查询到的时候就查询一张表 比如 用按照用户id 来分表 将一个用户的数据放在一个表中 然后在操作的时候就对一个用户就操作那个表就好了 这样可以控制表的数据量在可控范围内 比如每个表就固定在200万以内
分库
经验而言:一个库我们一般最多支持到并发2000 一定要扩容 而且一个库并发最好保持在每秒1000左右 不要太大 可以将一个库的数据拆分成多个库中 访问就访问一个库
用过哪些分库分表的中间件? 不同的分库分表中间件都有设么优点和缺点?
常见的包括
Cobar
TDDL
Atlas
Sharding-jdbc
Mycat
建议考量的 就是sharding-jdbc 和mycat
Sharding-jdbc 优点是在于不用部署 运维成本低 不需要代理层的二次转发请求 性能很高 但是需要各个系统重新升级版本在发布 各个系统需要耦合
Mycat 他需要部署 运维成本高 好处是在于对于各个项目是透明的
你们具体是如何对数据库进行垂直拆分和水平拆分
水平拆分:
将数据均匀的放到库里面 然后多个库来抗更高的并发 还有就是用多个库的存储容量来进行扩容
垂直拆分:
是把多个字段的表拆分为多个表 一般来说会将较少的放在一个表里 较多的放在另一个表里去
因为数据库里面是有缓存的 访问的评率越高行字段越少 就可以在缓存里缓存更多的行 性能就越好
最常见的 就是把一个大表拆开 订单表 订单支付表 订单商品表
分库分表的方式
Range来分 好处 扩容的时候很简单 提前准备一个库 然后到了新的月份的时候 就会写到新的库里 缺点 大部分请求都访问新的数据
Hash来分 好处 平均分配每个库的数据量和请求压力 坏处 就是扩容起来比较麻烦 迁移数据的时候 要重新计算hash值重新分配到不同的库和表