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. javascript - node.js promise沒用2. golang - 用IDE看docker源碼時的小問題3. c++ - 如何正確的使用QWebEngineView?4. yii2中restful配置好后在nginx下報404錯誤5. javascript - js 寫一個正則 提取文本中的數據6. 算法 - python 給定一個正整數a和一個包含任意個正整數的 列表 b,求所有<=a 的加法組合7. android 如何實現如圖中的鍵盤上的公式及edittext的內容展示呢8. java - 我在用Struts2上傳文件時,報以下錯誤怎么回事?9. php自學從哪里開始?10. 網站被黑,請教下大神,怎么對datebase.php內容加密。
