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

MySQL分表实现上百万上千万记录分布存储的批量查询设计模式

我们知道可以将一个海量记录的 MySQL 大表根据主键、时间字段,条件字段等分成若干个表甚至保存在若干服务器中。
唯一的问题就是跨服务器批量查询麻烦,只能通过应用程序来解决。谈谈在Java中的解决思路。其他语言原理类似。

这里说的分表不是 MySQL 5.1 partition,而是人为把一个表分开存在若干表或不同的服务器。



1. 应用程序级别实现



见示意图

SelectThreadManager 分表数据查询管理器
它为分表的每个database or server 建立一个 thread pool

addTask() -
添加任务
stopTask() - 停止任务
getResult() - 获取执行结果

最快的执行时间 = 最慢的 MySQL 节点查询消耗时间
最慢的执行时间 = 超时时间

某个 ThreadPool 忙时候处理流程
1. 假如 ThreadPoolN 非常忙,(也意味 DB N 非常忙)
2. 新的查询任务到来,addTask(), 新的任务的一个thread加到ThreadPoolN任务排队中
3. 外层应用已经获得其他 thread 返回结果,继续等待
4. 外层应用等待超时的时间到,调用 stopTask() 设置该任务全部 thread 中的停止标志, 外层应用返回。
5. 若干时间后,ThreadPoolN取到该排队 Thread, 因为设置了停止位,线程直接运行完成。
 


2. JDBC 层实现
 

做一个 JDBC Driver 的包装,拦截 PreparedStatement, Statement executeQuery()
然后调用 SelectThreadManager 完成

3. MySQL partition


MySQL 5.1 partition 功能由于单张表的数据跨文件,批量查询时候同样存在上述问题,不过它是在 MySQL 内部实现的,不需要外部调用者关心。其查询实现的原理应该大致类似。
partition 只解决了 IO 的瓶颈,并不能解决 CPU 计算的瓶颈,因此无法代替传统的手工分表方式。 

http://www.lryc.cn/news/121499.html

相关文章:

  • 射频入门知识-1
  • 基于注解函数式编程实现组件解耦设计
  • 并查集、树状数组
  • ES6中Null判断运算符(??)正确打开方式-
  • java的内存模型
  • 基于 CentOS 7 构建 LVS-DR 群集 配置nginx负载均衡
  • CSS练习
  • 基于深度学习的3D城市模型增强【Mask R-CNN】
  • LabVIEW对并行机器人结构进行建模仿真
  • 【算法题】1281. 整数的各位积和之差
  • (一)ES6 介绍
  • 窥孔优化(Peephole Optimization)
  • Docker安装ElasticSearch/ES 7.4.0
  • 无涯教程-Perl - readline函数
  • 类与对象(入门)
  • 刷题记录(2023-08-12)
  • GPT内功心法:搜索思维到GPT思维的转换
  • 在WebStorm中通过live-server插件搭建Ajax运行环境
  • 侯捷 C++ part2 兼谈对象模型笔记——1 转换
  • 尚硅谷大数据项目《在线教育之采集系统》笔记003
  • PAT(Advanced Level)刷题指南 —— 第七弹
  • 合宙Air724UG LuatOS-Air script lib API--sys
  • MySQL建表和增添改查
  • @Transactional 注解下,事务失效的七种场景
  • chrome V3 插件开发 基础
  • 【uniapp】uniapp自动导入自定义组件和设置分包:
  • 【深度学习MOT videos detect】Detect to Track and Track to Detect
  • 关于Neo4j的使用及其基本命令
  • 【笔记】树状数组
  • vue全局组件自动注册直接使用,无需单独先引用注册再使用