百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> mysql分库后怎么查询
分享文章到:

mysql分库后怎么查询

发布时间:09/01 来源:未知 浏览: 关键词:
分库分表的战略,依项目需求而定,这里采纳的是常规的做法:按照取模的方式,假设我们水平分库2个,每个库又水平拆表2个 既总共有4个表,查询的时候默许没有依照其他的前提停止排序,假设我们要查询第41页的数据,每页显示10条数据

第一种:

也是最简便的一种:通过额外的增加一张关联表,属性中必有id属性,至于可否有库id属性和表id属性(既第几个库和第几个表)无足轻重,由于这个可以按照id自行取模猎取,留意这张表存置的数据是所有数据,但是胜在属性列少,只要供给索引的几个属性列,这样的话我们只需要select * from brand_temp where … limit 400,10(插叙第41页的数据,每页显示5条数据),然后我们猎取了id之后就可以去对应的表中查询了

第二种:

最消耗机能的一种,假如我们要查询第一页的记载,单库单表的sql为:select * from db limit 0,10; 当我们分库分片之后 语句还是一样的语句,但是这时候我们需要对4个表返回的记载在内存中停止解析,然后通过id停止升序,取得前10条数据返回…数据量小,页码小的时候很ok,但是假如我们要查询第2页的数据的时候,sql单体架构的状况下为:select * from db limit 10,10; 但是在分布式数据库这样是不可的,数据很明显会丧失,补偿的办法是查询所有,sql语句为select * from db_x limit 0,10+10 //意味着需要查询的是本在单体架构上要查询的记载数加上此前的记载 ,然后再在内存中合并所有表返回的记载然后停止解析,最后取第10开端的记载 …可以看出这个方案一旦页码数到达n页,而每页显示的记载数为m笔记录的时候,每个表需要查询的记载数为:(n-1)*m+m=nm笔记录,内存中需要解析的记载数为 t * n * m 笔记录,cpu不爆炸算我输

第三种:

采取的是基于业务的模式:迫使会员没法停止跳页查询,什么意思呢,就是会员只能点击下一页或者上一页的方式阅读,详细的做法在于查询得到记载数的同时记载下当前独一id值的最大值,然后再次查询的时候增加where 前提…让我们从头开端捋: 第一次查询pageNum=1,pageSize=10 ,maxId=0->sql:select * from db_x where id>0 limit 10; 然后分发到对应的库的表中,将得到的4*10条数据合并,再在内存中停止解析排序,取前10条数据,同时将第10条数据的id=maxId独自取出渲染到前端页面上留存,这样当点击下一页的时候,这个maxId=10也提交上去了,sql 变成了select * from db_x where id>10 limit 10,然后连续解析,连续留存…这种方式返回的数据都是不乱的并且数据是连接的(排序)

第四种:

传奇中的最好的方式,支撑跳页查询,这个方式中心在于2次sql查询,详细如何做呢:

前提前提假设:查询第1001页的数据,每页显示10笔记录

1):我们先记载下要查询的记载数的范畴:(1001-1)*10=10000 开端,10010完毕->10000-10010
单体的sql为:select * from db limit 10000,10;
我们总共有4个表,意味着:每个表的start应当为10000/4=2500,从而sql变成了:
select * from db_x limit 2500,10;	//假设是均匀分配的,因此我们可以均分,不均分也不妨,后续操纵会补齐
我们会得到4个表中的记载:(由于我demo还没写,所以先手写了)
T1:(1,"a"),.......
T2:(2,"b"),.......
T3:(3,"c"),.......
T4:(4,"d"),.......
真实数据第1001页不成能是1开头的,将就着看吧,过几天会一起讲rabbitMQ分布式一致性和这个demo一起公布的
ok,第一阶段的sql查询完毕

2):对4个表中返回的记载停止id匹配(id假如非整型,自行用hashCode匹配),由于是升序查询,所以我们只需要比力下每个表的首笔记录
的id值即可,获得了最小的minId=1,和各个表最大的阿谁值maxId;ok,转换sql思绪,这里我们采纳前提查询了(补偿操纵第一步):
select * from db_x where id between minId and maxId 这样我们就猎取到了漏掉的数据(当然有余外的数据)
这样我们4个表中就返回了大概记载数各不雷同的记载,第二步完毕

3):
之跋文录minId显现的位置,如T1显现的位置为2500,T2显现的位置为2500-2=2048 ,T3显现的位置为2500-3=2047 ,T4显现的位置
为2500-3=2047 则终究显现的记载数为:2500+2048+2047+2047=10000-2-3-3=9992,因此我们需要的查询的记载数需要从9992 顺次往后取
8个开端,然后再取10个就是所求的数据,这种方式能做到数据准确查询,但是独一的缺陷就是每次查询都需要停止二次sql查询

以上就是mysql分库后如何查询的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板