分库分表浅析原理

数据库存放数据大了,查询等操作就会存在瓶颈,怎么办?

1. 如果是单张表数据大了,可以在原有库上新建几张表table_0、table_1、table_2、.....table_n

写程序对数据进行分表:

    --这里提供一种一种分表策略,这里只需维护分片字段与表序号的关系

伪代码:

   if(主键id % n)= x

   for( table:list [table_0、table1、table2、.....table_n ]){

       if(table.split("_")[1] = x ){

         //执行sql: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
       }
   }

如果数据还是很大,放在一个库都嫌拥挤,那就新增数据库,与上面的同理,就是维护分片字段与某数据库和某个库里的表

伪代码:假设有n个库,每个库有m张表

   if(主键id % n)= x

   if(主键id % m) = y

那么  大表里这条数据将落在第x库里的第y张表

 执行

   connet = JDBC.connet(x)

   connet.stamet.excute(inset into y..... ) 

    

实现技术原理:

根据所使用的技术不同拦截层面有多种,我想到就有

 1. SpringMVC 的拦截器可以在Controller层面实现上述分表策略

 2. 使用Aop 进行拦截,也能实现在Controller或Service层面实现上述分表策略

 3. 单独起一个微服务进行(如网关)进行拦截实现上述分表策略

 4. 使用中间件mycat 、sharding jdbc等原理跟3是差不多的,只不过有更丰富的分表策略和更成熟的方案

当然实际我们会使用定时任务 + 线程池+本地缓存(存limit值,防重复) 去扫描大表数据    分段 select * from big_table limit 1,1000 这样分表

补充:水平切分和垂直切分

 

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值