MySql分库分表设计
文章目录
- 一、分库分表方案
- 二、分库分表中间件
- 三、分库分表可能遇到的问题
- 四、应用场景
- 总结
一、分库分表方案
- 水平分库:以字段为依据,按照一定策略(hash、range 等),将一个库中的数 据拆分到多个库中。
- 水平分表:以字段为依据,按照一定策略(hash、range 等),将一个表中的数 据拆分到多个表中。
- 垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。
二、分库分表中间件
- sharding-jdbc(当当)
- Mycat
- TDDL(淘宝)
- Oceanus(58 同城数据库中间件)
- vitess(谷歌开发的数据库中间件)
- Atlas(Qihoo 360)
三、分库分表可能遇到的问题
- 事务问题:需要用分布式事务啦
- 跨节点 Join 的问题:解决这一问题可以分两次查询实现
- 跨节点的 count,order by,group by 以及聚合函数问题:分别在各个节点上得到结果后在应用程序端进行合并。
- 数据迁移,容量规划,扩容等问题
- ID 问题:数据库被切分后,不能再依赖数据库自身的主键生成机制啦,最简单可以考虑 UUID
- 跨分片的排序分页问题(后台加大pagesize 处理?)
四、应用场景
只分库不分表
当数据库的读写访问量过高,还有可能会出现数据库连接不够用的情况。这个时候我们就需要
考虑分库,通过增加数据库实例的方式来获得更多的数据库连接,从而提升系统的并发性能。
只分表不分库
当单表存储的数据量非常大的情况下,并且并发量也不高,数据库的连接也还够用。但是数据
写入和查询的性能出现了瓶颈,这个时候就需要考虑分表了。将数据拆分到多张表中来减少单表存储
的数据量,从而提升读写的效率。
既分库又分表
结合前面的两种情况,如果同时满足前面的两个条件,也就是数据连接也不够用,并且单表的
数据量也很大,从而导致数据库读写速度变慢的情况,这个时候就要考虑既分库又分表。
总结
以上为个人学习过程中对java的一些学习总结,如有错误,欢迎各位批评指导,如有侵权,请联系本人删除,如果觉得有一点帮助麻烦点个赞加收藏!谢谢!
还没有评论,来说两句吧...