現在業務中由於一些表越來越大,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 JPA
what -to-do-instead-of-sql-joins-while-scaling-horizontally
stackoverflow 上的一些答案
ringa_lee2017-06-23 09:14:49
只針對目前我們專案中的情況: 在分錶時根據hash演算法落到特定表,然後取的時候先根據演算法取得資料的分佈位置,然後就是正常的select了
漂亮男人2017-06-23 09:14:49
不建議連表查詢
1.資料庫資源比較寶貴,連表查詢會佔用大量的內存,導致資料庫效能下降
2.不支援資料在多個資料庫實例,分庫情況無法處理,擴充性較差
通用做法是將連表查詢,查分成多個單表查詢,然後將結果加總。
1.能夠上述連表查詢的問題
2.多次查詢也可以在程式中對每一次查詢的中間結果做處理,這是一個靈活性。
3.應用程式也可以隨時擴展,更有彈性
如果是離線場景,建議使用MR(mapreduce)框架來處理,例如:hadoop等,對應的,需要將資料寫入hdfs上。