hash oracle 分表 資料庫hash分表

2021-10-21 08:46:20 字數 2572 閱讀 6138

前言

平常我們一直用的就是按時間進行分表,按時間分表可以減輕以時間維度的查詢。但是如果查詢的條件不是時間,那麼當查詢主表的時候,就會去遍歷所有的分表,沒有起到分表的優化效果。

方法如果不能按照時間分表,我們可以採取按hash進行分表,如人員特別多的情況下,可以按照人員id進行hash分表,在查詢的時候就可以根據hash到分表裡面去查詢人員資訊了。

public class tablehashpartitionutil {

public tablehashpartitionutil() {

// no_op

* 功能描述: 生成分割槽語句,分割槽語句不支援動態分割槽,只能在設計階段預估資料量之後選擇好分割槽個數,然後進行分割槽

* @param tablename 主表名稱

* @param colname 分割槽依賴的欄位名

* @param partitions 分割槽個數

* @return 返回資訊:分割槽的執行語句

* @author wangcanfeng

* @date 2019/12/3-14:17

* @since 1.1.100

public static string partitionsql(string tablename, string colname, integer partitions) {

stringbuilder ps = new stringbuilder();

return ps.tostring();

* 功能描述: 觸發器函式,引導資料,將寫入到hash值一致的表中

* 注意: 表名稱,列名稱,分割槽數都要和分表語句中的相一致

* @param tablename 表名稱

* @param colname 分割槽依賴的欄位名

* @param partitions 分割槽個數

* @return 返回資訊:分割槽的執行語句

* @author wangcanfeng

* @date 2019/12/3-14:23

* @since 1.1.100

public static string insertfunction(string tablename, string colname, integer partitions) {

stringbuilder helper = new stringbuilder();

for (int i = 0; i < partitions; i++) {

return helper.tostring();

* 功能描述: 預防分表依賴的字段為空,為空的情況插入到主表中

* @param tablename 表名稱

* @param colname 分割槽依賴的欄位名

* @return 返回資訊:

* @author wangcanfeng

* @date 2019/12/3-14:28

* @since 1.1.100

public static string protectnull(string tablename, string colname) {

string pn="create trigger %s_ins_tg before insert on %s for each row when (new.%s is not null) execute procedure ins_%s();";

return string.format(pn, tablename,tablename,colname,tablename);

* 功能描述: 查詢的時候需要新增上這個約束條件,在where條件裡面用and連線

* 注意:不加上這個約束將無法加速查詢,查詢將經歷這些表

* @param colname 分割槽依賴的欄位名,如果插入的引數不是分割槽依賴的字段,可能會出現異常或無效

* @param colvalue 分割槽依賴的字段值

* @param partitions 分割槽數目

* @return 返回資訊:加速查詢的拼接語句

* @author wangcanfeng

* @date 2019/12/3-14:35

* @since 1.1.100

// 判斷要查詢的值在哪個分割槽

string judgepartition = "abs(mod(hashtext(%s::text), %d))=abs(mod(hashtext('%s'::text), %d))";

return string.format(judgepartition, colname, partitions, colvalue, partitions);

缺點(1)查詢的時候沒有像按時間分表一樣自由,查詢的時候需要在where的條件中增加"abs(mod(hashtext(欄位名::text), %d))=abs(mod(hashtext('字段值'::text), %d))",同時因為是hash值,像時間一樣需要範圍查詢的時候會比較麻煩

(2)在建表的時候需要先預估好資料量的大小,然後執行分表,不能想按時間分表一樣動態分表

優勢按hash分表可以將一張表中的資料根據hash值分到各個子表中,可以根據hash值到指定的子表中進行查詢,相當於只需要查1/n的資料量即可。

資料庫分表

create table table1 id int 10 unsigned not null auto increment,name varchar 45 primary key id engine myisam create table table2 like table1 建立總表 creat...

資料庫分表策略

1 垂直劃分 將資料表中的某些字段提出,組成新的資料表。將群組id,id,id提出 組成gzm資料表,而將 群組,的詳細資訊單獨放在其他資料表中 在求取索引 關係時,運算元據庫效率更高。2 水平劃分 2.1物理上的水平切分 即將資料分配到不同的db伺服器上。降低單點機器的負載。2.2邏輯上的水平劃分...

資料庫分庫分表

1 基本思想之什麼是分庫分表?從字面上簡單理解,就是把原本儲存於乙個庫的資料分塊儲存到多個庫上,把原本儲存於乙個表的資料分塊儲存到多個表上。2 基本思想之為什麼要分庫分表?資料庫中的資料量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的資料量也會越來越大,相...