旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

mysql分库后怎样查询【MySQL教程】,mysql

作者:搜教程发布时间:2019-12-01分类:MySQL教程浏览:48评论:0


导读:分库分表的战略,依项目需求而定,这里采纳的是通例的做法:依据取模的体式格局,假定我们程度分库2个,每一个库又程度拆表2个既总共有4个表,查询的时刻默许没有根据其他的前提举行排序,...
分库分表的战略,依项目需求而定,这里采纳的是通例的做法:依据取模的体式格局,假定我们程度分库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分库后怎样查询的细致内容,更多请关注ki4网别的相干文章!

标签:mysql


欢迎 发表评论: