海量数据查询方案mysql_Mysql海量数据存储和解决方案之二—-Mysql分表查询海量数据…[通俗易懂]

关键词:分库分表,路由机制,跨区查询,MySQL数据变更,分表数据查询管理器与线程技术的结合,Cache前面已经讲过Mysql实现海量海量数据存储查询时,主要有几个关键点,分表,分库,集群,M-S,负载均衡。其中分库分表是很重要的一点。分库是如何将海量的Mysql数据放到不同的服务器中,分表则是在分库基础上对数据现进行逻辑上的划分。数据划分可有多种方式,找到一个主键后,可以按号段分,也可以Has…

大家好,又见面了,我是你们的朋友全栈君。

关键词:分库分表,路由机制,跨区查询,MySQL 数据变更,分表数据查询管理器与线程技术的结合,Cache

前面已经讲过Mysql实现海量海量数据存储查询时,主要有几个关键点,分表,分库,集群,M-S,负载均衡。

其中分库分表是很重要的一点。分库是如何将海量的Mysql数据放到不同的服务器中,分表则是在分库基础上对数据现进行逻辑上的划分。

数据划分可有多种方式,找到一个主键后,可以按号段分,也可以Hash取模分,也可以选择在认证库中保存DB配置。具体如何选择具体情况具体分析。

划分后,就是后期的查找和维护工作了。为了实现快速查找,得有一个高效的查找机制,这里可以选择建索引的方法,并充分借鉴已有的成熟的路由技术。同时,增减数据时,还要考虑到索引的维护,数据迁移时,数据的重新分摊也是一个要考虑的问题。下面具体分析数据变更的情形:

大型应用中Mysql经常碰到数据无限扩充的情况。常用解决方案如下:

MySQL master/slave:只适合大量读的情形,未必适合海量数据。MySQL cluster:提供的可能不是大家想要那种功能。MySQL proxy: MySQL master/slave配合MySQL 5.1 partition:只是将一个表存储上逻辑分开,部分改善了性能,但是可扩展性仍然是问题。

MySQL对于海量数据按应用逻辑分表分数据库,通过程序来决定数据存放的表。但是

跨区查询是一个问题,当需要快速查找一个数据时你得准确知道那个数据存在哪个地方。为了达到这个目的,可以将分表逻辑放到中间层,这样上层的应用则就简单很多,也便于扩展。下面结合网上一个关于分表查询很好的例子分析:

2ac9fd1105b23a27dec8d0d8b4ac8c0f.png

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

对于这个问题还有许多其他方法,学网络的应该很熟悉DNS的两种查询方法:递归方式和迭代方式。这些思路也可以应用到数据库查询中来并应用。如,HSCALE分表分数据库的思路:是在的基础上,在MySQL proxy的层面将上层的请求分配到实际的表上。实际的原理是通过拦截SQL进行替换和服务器重定向再将SQL传递到目标服务器上。它的分表算法可以由自定义的Lua脚本来实现,非常灵活。目前已经能支持同数据库分表,跨数据库的实现也将增加,因为在MySQL proxy的框架下,这并不是很困难的事情。使用HSCALE有2个开销,一是网络层面的,、MySQL proxy对每个SQL会增加0.0 ms级的网络延迟,如果增加了HSCALE,则会增加0. ms级延迟。第2个开销则是MySQL proxy, Lua, SQL解析,HSCALE算法等造成。现在的版本或许不是很成熟,但是在原理上基本上没多大障碍,发展下去将是一个不错的选择。具体可参照:。

海量数据查询时,还有很重要的一点,就是Cache的应用。不过是不是Cache在任何时候都是万能贴呢?不一定。Cache也命中率,维护等问题。而且在访问Cache时,系统会和一个单一的锁来对访问进行控制,这样最初的查询请求会被阻塞,直到锁释放。关于这个可以查看High Performance MySQLSecond Edition一书,中对此有很好的总结。

扩展知识:

DNS查询有两种试:递归方试和迭代方式。递归是如果被查询的名称服务器不是所请求的数据的权威,它将不得不向其他名字服务

器发出查询以获得答案。它可以向其他名字服务器发送递归查询,从而要求它们找到答案并返回。

迭代查询中名字服务器只用将它已知的最合适的答案返回给查询者。它本身不需要再有任何其他查询。被查询的名字服务器在它的本地数据中寻找所需数据。如果没有找到答案,它就在本地数据中找出与所要查询的名字服务器最接近的名字服务器的名字和地址,并作为指示返回给查询者,帮助它把解析过程进行下去。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-07-30 20:23

浏览 3389

分类:数据库

评论

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129574.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 脉冲控制仪设置参数_科迈控制器中文说明书

    脉冲控制仪设置参数_科迈控制器中文说明书驱动修改点A:sensor_xxxx_mipi_raw.c1.获取PD信息函数staticconstcmr_u16xxxx_pd_is_right[]=PD点位置信息,遮住右半边表示右点,用1表示,遮住左半边表示左点,用0表示;具体需要看sensorstaticconstcmr_u16xxxx_pd_row[]=PD位置行坐标staticconstcmr_u16xxxx_pd_col[]=PD位置列坐标staticconststructpd_pos_info_

    2025年9月26日
    4
  • 阿里云API接口调用[通俗易懂]

    阿里云API接口调用[通俗易懂]阿里云针对自己的平台提供了非常丰富的API接口,而且他们有提供openapi可视化服务,非常方便。阿里云openapi地址:https://api.aliyun.com/这里我在查询全部RDS资产

    2022年7月3日
    85
  • 怎么把已有的RSA公私钥转换成PKCS8格式

    怎么把已有的RSA公私钥转换成PKCS8格式

    2021年7月17日
    118
  • 男人的恋爱过程「建议收藏」

    男人的恋爱过程「建议收藏」当对选择恋人的过程越谨慎,就越容易找到适合的恋人。虽然有的人很快就达到目的,但是基本上这是一个不断尝试与错误的过程。透过自我调整,最后终将达成目的。对常规四个阶段变化的了解,你可以了解你距离目标还有多远。让我们仔细探索男人、在四个阶段中的不同反应。男人:生理上的吸引在第一阶段男人对女人先产生生理上的吸引是很正常的。男人尤其注意女人的外表,她走路的方式、她的头发、微笑、眼睛、身高、美腿、…

    2022年7月25日
    11
  • java中的stringbuffer是什么_java string类

    java中的stringbuffer是什么_java string类之前回答过这个两个的区别,直接拷过来,希望对你有所帮助!关于这两个类,文档里面列的很明确了,注意养成经常查文档的好习惯!话不多说开始:区别一:在Java中字符串使用String类进行表示,但是String类表示字符串有一个最大的问题:“字符串常量一旦声明则不可改变,而字符串对象可以改变,但是改变的是其内存地址的指向。”所以String类不适合于频繁修改的字符串操作上,所以在这种情况下,往往可以使用…

    2022年9月21日
    4
  • linux中mkdir命令含义,Linux中mkdir命令详解

    linux中mkdir命令含义,Linux中mkdir命令详解Linux 中 mkdir 命令详解 linuxmkdir 用来创建目录 要求创建目录的用户在当前目录中具有写权限 并且指定的目录名不能是当前目录中已有的目录 1 新建一个文件夹 one2 新建三个文件夹 three four five3 新建一个多层级文件夹 a 01 总结以上所述是小编给大家介绍的 Liunx 中 mkdir 命令详解 希望对大家有所帮助 如果大家有任何疑问请给我留言 小编会及

    2025年8月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号