資料庫存儲量達到一定程度的時候,就需要進行分表以減輕檢索的消耗。
常用的分表方式包括水準和垂直分表。本次進行的是按照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;
複制代碼
如此這般。