海量数据查询方案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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java的几个版本

    Java的几个版本一、JavaSE(JavaPlatform,StandardEdition)JavaSE以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。JavaSE包含了支持 JavaWeb服务开发的类,并为JavaPlatform,EnterpriseEdition(JavaEE)提供基础。二、JavaEE(JavaPlatform,EnterpriseEdition) 这个版本以前称为J2EE。企业版本帮助开发和部署可移植

    2022年7月8日
    26
  • error at hooking api ntprotect_read,match and write

    error at hooking api ntprotect_read,match and write 编译环境:delphi2010+windows7u,用途读取其他程序中readprocessmemory和writeprocessmemory的参数,但不知读取偏移即a+($b),b是怎么读的  一、用hook全局钩子线程钩子:已实现使用INLINEhookapi,CriticalSection临界区,dll分为动态loadlibry和静态加载问题1:对多线程目标

    2025年11月5日
    3
  • ettercap 图形界面遇无线网卡报错[通俗易懂]

    ettercap 图形界面遇无线网卡报错[通俗易懂]ettercap0.8.2copyright2001-2015EttercapDevelopmentTeamERROR:9,错误的文件描述符[/build/ettercap-W54WVV/ettercap-0.8.2/src/ec_network.c:source_init:245]libnet_init:unknownphysicallayertype0…

    2022年6月28日
    30
  • 真正免费的国外PHP建站空间

    真正免费的国外PHP建站空间最近在学习wordpress,找了一个挺不错的国外免费建站空间:http://www.000webhost.com/582659.html空间属性:空间容量 1500MB数据流量 100GB/月附加域名  5个子域名   5个E-mail地址  5个MySQL数据库  2个

    2026年2月5日
    4
  • mysql跨库分页、分表为什么这么难?[通俗易懂]

    mysql跨库分页、分表为什么这么难?[通俗易懂]前言:当业务数据达到一定量级(比如:mysql单表记录量>1千万)后,通常会考虑“分库分表”将数据分散到不同的库或表中,这样可以大大提高读/写性能。但是问题来了,对于select*fromtablelimitoffset,pagesize这种分页方式,原来一条语句就可以简单搞定的事情会变得很复杂,本文将与大家一起探讨分库分表后”分页”面临的新问题。mysql跨库分页、分表为什么这么难?一、分表对分页的影响1.1分段法1.2模余均摊法二、全局法(limitx+y)2.1按分段

    2022年7月20日
    12
  • Windows Mobile 6 Professional SDK 「建议收藏」

    Windows Mobile 6 Professional SDK 「建议收藏」Lotyong的WindowsMobile6ProfessionalSDKhttp://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows%20Mobile%206%20Professional%20SDK.msiWindowsMobile6Professio

    2022年7月12日
    24

发表回复

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

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