sharding - 数据库分库切表后Java后端代码实现以及最佳实践
问题描述
现在业务中由于一些表越来越大,read的时候压力很大(write的需求比较小),所以在数据库端决定把一些数据量特别大的表切表, 但是在后端代码中有很多代码/query需要做join这些表,请问这样的情况下大家是怎么样解决的?
比如我们现在有 SampleTable 有大概1亿条数据,我们根据逻辑切成了大概16个不同的表:SampleTable 1,SampleTable2...SampleTable31,以前代码中有query 类似于:
select * from SampleTable join test_table
现在需要执行这样的query 多次然后把数据聚合起来做为返回结果吗?
select * from SampleTable1 join test_table
有没有更好的方法或者library推荐?有没有什么beset practice或者sample code?
如果之后我们要多个表拆分到不同的database server上,是否在后端代码得加上不同db 的数据库连接?
数据库Sharding的基本思想和切分策略这篇文章更多的是数据库切分的策略,是否有人能提供下实际的项目code sample?Database sharding and JPAwhat-to-do-instead-of-sql-joins-while-scaling-horizontally
stackoverflow 上的一些答案
问题解答
回答1:可以考虑引入数据库中间件sharding-jdbc client级别mycat-server server级别
回答2:朋友介绍 Spark 不错,支持 SQl 式的查询,1 亿条数据 0.5 秒左右返回结果
回答3:只针对目前我们项目中的情况: 在分表时根据hash算法落到特定表,然后取的时候先根据算法获取数据的分布位置,然后就是正常的select了
回答4:不建议连表查询1.数据库资源比较宝贵,连表查询会占用大量的内存,导致数据库性能下降2.不支持数据在多个数据库实例,分库情况无法处理,扩展性较差
通用做法是将连表查询,查分成多个单表查询,然后将结果在应用中汇总。1.能够上述连表查询的问题2.多次查询也可以在程序中对每一次查询的中间结果做处理,这是一个灵活性。3.应用也可以随时扩展,更加灵活
如果是离线场景,建议使用MR(mapreduce)框架来处理,例如:hadoop等,相应的,需要将数据写入到hdfs上。
回答5:http://blog.csdn.net/tianyale...详解分库分表
相关文章:
1. node.js - mongodb查找子对象的名称为某个值的对象的方法2. html5 - 图片一般一怎么的形式存放在服务器中的?3. python - flask post提交timestamp不能作为参数,这是为什么?4. 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败!5. 网页爬虫 - python 爬取网站 并解析非json内容6. javascript - 回调函数和闭包的关系7. 百度地图api - Android 百度地图 集成了定位,导航 相互的jar包有冲突?8. 正在使用electron和node.js做桌面应用,需要实时监听是否有网络连接,node或者electron是否可以做到9. javascript - 如何获取未来元素的父元素在页面中所有相同元素中是第几个?10. spring-mvc - spring-session-redis HttpSessionListener失效

网公网安备