Mysql 資料庫水平分表 儲存過程

晦若晨曦發表於2017-12-14

資料庫儲存量達到一定程度的時候,就需要進行分表以減輕檢索的消耗。

常用的分表方式包括水平和垂直分表。本次進行的是按照uid進行水平分表。

##分表思路: 水平分表平均的將資料按照特定方式分配到多個表中。理論上每個表的訪問頻次和資料量都是同一水平的。

水平分表有很多種劃分方式。在這裡使用的是最簡單的一種:按照id求餘進行劃分。

比如現在要將table分成100張表,需要建立一百張新表table_1,table_2等。然後根據uid%100的餘數,來分配到對應的表中。

在程式中呼叫,也只需要按照同樣的規則對uid求餘,然後利用字串拼接自動生成對應的表名,查詢不同的表即可。

##程式碼實現:

雖然是第一次寫儲存過程,但是確實十分簡單:

CREATE DEFINER=`root`@`localhost` PROCEDURE `divide_table_by_mod`(tableName varchar(64), target int)
BEGIN

declare ntname varchar(64);

declare i int;
set i=0;

while (i<target) do

	set @newTname = concat(tableName,"_",i);
    set @createSql = concat("create table ",@newTname," like ",tableName);
    set @insertSql = concat("insert into ",@newTname," select * from ",tableName," where uid%",target,"=",i);
    
    prepare dcsql from @createSql;
    execute dcsql;
    deallocate prepare dcsql;
    
    prepare disql from @insertSql;
    execute disql;
    deallocate prepare disql;
    
    set i = i+1;

end while;

END

複製程式碼

##遇到問題:

  • 字串連結: 在mysql的儲存過程中,字串拼接需要使用concat函式,這個函式可以接收多個輸入最終拼接成一個字串。
  • 動態sql 動態的sql不能直接將變數寫到sql裡面來執行。需要先拼接一個sql,然後
 prepare dcsql from @createSql;
    execute dcsql;
    deallocate prepare dcsql;

複製程式碼

如此這般。

相關文章