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

2016-02-19 18:05 78 1 收藏

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的MySQL分表实现上百万上千万记录分布存储的批量查询设计模式,希望大家看完后能赶快学习起来。

【 tulaoshi.com - 编程语言 】

  我们知道可以将一个海量记录的 MySQL 大表根据主键、时间字段,条件字段等分成若干个表甚至保存在若干服务器中。

  唯一的问题就是跨服务器批量查询麻烦,只能通过应用程序来解决。谈谈在Java中的解决思路。其他语言原理类似。

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

  1. 应用程序级别实现

  见示意图

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  SelectThreadManager 分表数据查询管理器

  它为分表的每个database or server 建立一个 thread pool

  addTask() - 添加任务

  stopTask() - 停止任务

  getResult() - 获取执行结果

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

  最慢的执行时间 = 超时时间

  某个 ThreadPool 忙时候处理流程

  1. 假如 ThreadPoolN 非常忙,(也意味 DB N 非常忙);

  2. 新的查询任务到来,addTask(), 新的任务的一个thread加到ThreadPoolN任务排队中

  3. 外层应用已经获得其他 thread 返回结果,继续等待

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  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 计算的瓶颈,因此无法代替传统的手工分表方式。

来源:https://www.tulaoshi.com/n/20160219/1616779.html

延伸阅读
代码如下: drop table if exists dd; create table dd ( user_id int , class_no int , score int ); insert into dd values (1,1,1), (2,1,1), (3,1,2), (4,2,2); select class_no ,avg(score)from dd group by class_no order by avg(score); 在MySQL下面测试通过。
标签: ASP
  <% rem 文章题目 asp中利用数组实现数据库记录的批量录入方法(原创) 作者:yanek 联系email:aspboy@263.net % 包括两个文件 1。allneeddj.asp:实现表单的生成 2. allneeddjresult.asp 处理表单批量录入 3.hbedu.mdb :数据库文件 其数据库结构如下 provinceid:省份编号 数值型 dytaocount:打样套数 数值型 papertaocount:纸样套数 ...
标签: MySQL mysql数据库
以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了。 SELECT * FROM table_name ORDER BY rand() LIMIT 5; rand在手册里是这么说的: RAND() ,RAND(N) :返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指...
有个需求,一直没有解决,在google上找了半天,给出的方案没有一个能用了,最后鬼使神差搞定了。  是这样的,假设一个表: id   f_id    value    1     2         a    2  ...
随着传统的数据库、计算机网络和数字通信技术的飞速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注。但由于其开发较为复杂,在一定程度上制约了它的发展。基于此,本文提出了在.Net环境下使用一种新的开发语言C#结合ADO.Net数据访问模型来开发分布式数据库系统,大大简化了开发过程。 ...

经验教程

192

收藏

10
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部