數據庫存儲量達到一定程度的時候,就需要進行分表以減輕檢索的消耗。
常用的分表方式包括水平和垂直分表。本次進行的是按照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)
BEGINdeclare ntname varchar(64);declare i int;
set i=0;while (i<target) doset @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;復制代碼
如此這般。