天天看點

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

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

常用的分表方式包括水準和垂直分表。本次進行的是按照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;

複制代碼
           

如此這般。