垂直分库
- 同样的 , 垂直分库和垂直分表也十分类似 , 不过垂直分表拆分的是字段 , 而垂直分库 , 拆分的是表 。
- 垂直分库是将一个库下的表作不同维度的分类 , 然后将其分配给不同子库的策略 。
- 例如 , 我们可以将用户相关的表都放置在usrdata这个库中 , 将订单相关的表都放置在odrdata中 , 以此类推 。
- 垂直分库的分类维度有很多 , 可以按照业务模块划分(用户/订单...) , 按照技术模块分(日志类库/图片类库...) , 或者空间 , 时间等等 。
文章插图
问题事务问题 。
- 问题描述:在执行分库分表之后 , 由于数据存储到了不同的库上 , 数据库事务管理出现了困难 。如果依赖数据库本身的分布式事务管理功能去执行事务 , 将付出高昂的性能代价;如果由应用程序去协助控制 , 形成程序逻辑上的事务 , 又会造成编程方面的负担 。
- 解决方法:利用分布式事务 , 协调不同库之间的数据原子性 , 一致性 。
- 问题描述:在执行了分库分表之后 , 难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上 , 这时 , 表的关联操作将受到限制 , 我们无法join位于不同分库的表 , 也无法join分表粒度不同的表 , 结果原本一次查询能够完成的业务 , 可能需要多次查询才能完成 。
- 解决方法:tddl、MyCAT等都支持跨分片join 。但是我们应该尽力避免跨库join , 如果一定要整合数据 , 那么请在代码中多次查询完成 。
- 问题描述:额外的数据管理负担 , 最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题 , 这些都可以通过应用程序解决 , 但必然引起额外的逻辑运算 , 例如 , 对于一个记录用户成绩的用户数据表userTable , 业务要求查出成绩最好的100位 , 在进行分表之前 , 只需一个order by语句就可以搞定 , 但是在进行分表之后 , 将需要n个order by语句 , 分别查出每一个分表的前100名用户数据 , 然后再对这些数据进行合并计算 , 才能得出结果 。
- 解决方法:无解 , 这是水平拓展的代价 。
本文作者: ML李嘉图
本文链接:
https://www.cnblogs.com/zwtblog/p/15332735.html
推荐阅读
- Brython:浏览器中的Python
- 知乎|跟进微博、抖音!知乎宣布全面上线显示用户IP属地
- MySQL的监控原理
- Java开发中的POJO、Dto、PO、Vo傻傻分不清楚?一文看懂
- SQL注入笔记记录+MySQL的事务隔离级别
- 荣耀|荣耀畅玩30入网:2.2GHz 5G芯片、4900mAh大电池
- 一些小故事大道理?小故事大、道理
- 打跑得快技巧十句口诀是什么?
- 读 MySQL 源码再看 INSERT 加锁流程
- MySQL 大批量插入,如何过滤掉重复数据?