千家信息网

mysql分库后如何查询

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下mysql分库后如何查询,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!分库分表的策略,依项目需求而定,这里采用的是常规的做法:根据取模的方式,假设我们水平分库2个,每个
千家信息网最后更新 2026年11月03日mysql分库后如何查询

小编给大家分享一下mysql分库后如何查询,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

分库分表的策略,依项目需求而定,这里采用的是常规的做法:根据取模的方式,假设我们水平分库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分库后如何查询有了一定的了解,想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

查询 数据 属性 方式 时候 分库 位置 内存 条件 单体 就是 语句 排序 最大 做法 分布式 升序 同时 意味 架构 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技行业发展 鸠鸠互联网科技 成都互联网科技公司 科技互联网公司logo 火传媒上海互联网科技 互联网养老 桔豆科技 居家互联网科技有限公司 互联网科技中介 花神(南京)互联网科技有限公司 电子科技大学互联网创业大赛 青海科技产业互联网发展 亳州好赞互联网科技有限公司 互联网行业科技股 朱啸虎曾投资哪些互联网科技企业 烟台灵鸽互联网科技有限公司 2021互联网科技公司排名 抖集互联网科技技术咨询 互联网科技接地气 承德科技产业互联网平台 互联网科技自媒体灵感 深圳互联网科技公司 佩信高科技互联网 哈尔滨秒房互联网科技有限公司 花神(南京)互联网科技有限公司 互联网媒体平台算高科技产业 华夏恒生科技与互联网科技 群盈汇互联网科技有限公司 怎样加入科技互联网 互联网企业科技类企业如何做账 唐山双旺合互联网科技产业园
0