数据库存储量达到一定程度的时候,就需要进行分表以减轻检索的消耗。
常用的分表方式包括水平和垂直分表。本次进行的是按照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;
复制代码
如此这般。