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;

复制代码

如此这般。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值