当前位置: 首页 > news >正文

分库分表浅析原理

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

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 这样分表

相关文章:

  • mysql和redis的区别
  • Python爬虫之爬取并下载哔哩哔哩视频
  • 剪枝例题一道
  • 10 | MySQL为什么有时候会选错索引?
  • 如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中
  • 数据结构之顺序表及其实现!
  • 存算一体成为突破算力瓶颈的关键技术?
  • SpringCloud-MQ消息队列
  • 从零开始手写RPC框架(4)
  • 【操作系统学习笔记】文件管理2.1
  • Git 开源的版本控制系统-06-share to github 如何把项目代码共享到 github
  • 设计模式 工厂模式
  • LeetCode904:水果成篮
  • 智能革新:2024年AI辅助研发的挑战、机遇与未来展望
  • 在职场上,如何提升影响力
  • 七、软考-系统架构设计师笔记-数据库设计基础知识
  • 类复习【C#】
  • 【敬伟ps教程】文字处理工具
  • c#触发事件
  • Spring Boot 注解教程
  • 北京:下调个人住房公积金贷款利率
  • 对话|蓬皮杜策展人布莱昂:抽象风景中的中国审美
  • 百济首次实现季度营业利润扭亏,泽布替尼销售额近57亿元
  • 两国战机均未侵入对方领空,巴方公布对印回击细节
  • 央行行长:未来还可以扩大结构性货币政策工具规模或创设新的政策工具
  • 象屿集团:对去化压力大、市场有效需求不足区域坚决暂停投资,打造多元上市路径