分享一點數據庫內水平分表的小技巧

在業務中,經常會遇到單一表數據量過大的問題,在查找時速度逐漸變慢,更新操作也不敢太頻繁,存在高併發時的性能問題,還有心理問題,一張數據量龐大的表,總會擔心什麼時候會崩掉

爲了解決這個問題,我們可以對一張大數據量的表進行水平切分,水平切分的意思就是把數據記錄分攤出去,不會影響業務,提高一點性能,不是按照列切分(這叫垂直切分)。但是呢,水平切分也會造成數據維護起來比較麻煩。

怎麼個切分法?
我的做法是創建一張模板表,然後根據完整業務的最小單位(比如電商系統,訂單是最小單位;數據處理系統,任務是最小單位等等),把任務平均存儲在不同的數據庫表中,這些數據庫表是以模板表動態創建的。這個動態創建的依據,可以是跟業務有關,也可以是純技術手段。我選用hashCode生成n張表,所有的記錄會根據任務id的hashCode計算,存儲在不同的表中,表的區分加後綴名區分即可。
比如:
模板表:t_table
實際表:t_table_1
t_table_2
t_table_3

t_table_n-1
t_table_n

簡單說下具體要怎麼應用,以mybatis爲例
1.數據庫要先有模板表t_table
2.代碼生成策略,這裏調用hashCode生成n:

public static String hashTableNum(String id) {
		int code = Math.abs(id.hashCode()) % 500 + 1;
		return code + "";
	}

3.在mybatis中創建新表

<update id="createNewTable" parameterType="java.lang.String">
	CREATE TABLE IF NOT EXISTS ${tableName} LIKE t_table;
  </update>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章