面试官:MySQL分表后,如何做分页查询?






面试官: 美团外卖的分库分表怎么设计?

以下正文:

随着项目运行的时间越来越长,有些数据的存储也会越来越大,比如一些点击量,浏览量量,单表的数据可以到达上千万条数据,这时候会存在单表数据过大,查询效率低的问题。

为了提高查询效率这时候需要对单表进行拆分,比如一张1000万条数据的表,我们需要把它拆分为10张表,一张表就需要100万,mysql中单表都有一个最大存储的阈值,数据量不能超过这个值;

分表之间,我们需要去生产一个上万条的数据的表,这里我生产了如下的数据:

我需要对这张表进行拆分多张,我这里拆分了2张表;

第一步:

表一:

DROP table IF EXISTS tb_member1;
create table tb_member1(
    id bigint primary key auto_increment ,
    name varchar(20),
    age tinyint not null default '0'
)ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

表二:

DROP table IF EXISTS tb_member2;
create table tb_member2(
    id bigint primary key auto_increment ,
    name varchar(20),
    age tinyint not null default '0'
)ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

接下来开始进行拆分:

insert into tb_member1(id,name,sex) select id,name,sex from dd_user where id%2=0;
insert into tb_member2(id,name,sex) select id,name,sex from dd_user where id%2=1;

数据被分为:

这时候表基本是已经拆分完成。

接下来,我们需要考虑的是一张user表被拆分成2张表,那分页如何实现呢?

第一步:

创建一个主表:

DROP table IF EXISTS tb_member_all;
create table tb_member_all(
id bigint primary key auto_increment ,
name varchar(20),
age tinyint not null default '0'
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;

执行上述出现如下问题:

ERROR 1168 (HY000): Unable to open underlying table which is differently defined
or of non-MyISAM type or doesn't exist

需要检查:

  1. 查看上面的分表数据库引擎是不是MyISAM.
  2. 查看分表与指标的字段定义是否一致。

上述的都成功以后,我们会发现,你在member1或者member2中创建数据member_all表中也会出现同样的数据

所以:tb_member_all表就是tb_member1tb_member2的并集,刚刚实现到这里,我也没理解,后来看了一些文档,了解了一下:

其实tb_member_all表里面是没有存储数据,它就是一个外壳,里面的数据是tb_member1tb_member2的并集,数据的存储是放在分表中;

这时候,我们就豁然开朗了,利用这个tb_member_all,我们就可以实现数据查询的分页;

java代码实现:

id%2这是取模处理,分配数据进入哪个数据;

我们在做分页的时候就利用tb_member_all表去做分页查询实现

测试结果:






END

1.Redis实现分页+多条件模糊查询组合方案!2.MySQL我随手造200W条数据,给你们讲讲分页优化3.分库分表之后,自增主键如何处理?4.分库分表后,数据库数据一致性问题如何解决?

我是技术程管家,专心做内容,不割韭菜

分享技术成长之路,不忘初心,惠泽他人终身学习,与时俱进,点赞关注不迷路

相关推荐

  • 朋友月薪8k,跳槽面试一家公司,电话面试10分钟,到了谈薪环节,结果HR严肃地说:不要和面试官透露薪资!
  • Llama架构比不上GPT2?神奇token提升10倍记忆?
  • CCL 2024专题论坛征集开启,期待七月太原相聚 | CCL2024
  • 多思考模型的奇怪结果真的很重要--Kaggle第二名方案分享。
  • [开源]一款开源的图片在线设计工具,开箱即用,可免费商用
  • 十年前的微信消息收发架构长啥样?
  • 开源8K+高星的一键式AI视频生成工具
  • AI检测丁丁技术引争议!官方号召用户上传照片:急需各种丁照,越多越好!
  • “计算机视觉女神”被IEEE期刊封杀
  • Eric Evans 鼓励 DDD 实践者尝试 LLM
  • C++ 会变成像 Rust 一样的安全语言吗?
  • 火速报名!探索未来数据库的无限可能 ,腾讯云 HTAP 技术与自研力量的深度揭秘 | Q推荐
  • QCon 北京2024 盛大开幕,韦青、王皓、程操红、郭东白、章文嵩、蒋晓伟、李飞飞、张凯等行业领袖呈现精彩分享
  • 用 100 年前的 IT 架构和淘汰的软盘技术,美国列车系统升不了级:要花费十年、上百亿美元,“风险太大!”
  • 每日prompt:红发辫子女孩
  • 音乐创作工具suno的劲敌Udio上线了~Midjourney 新版本v 6.1即将到来
  • 看不懂来打我,vue3如何将template编译成render函数
  • 前端代码规范 - 图片相关
  • 如何写出“高颜值”的Python代码
  • 写给职场新人|从迷茫到屡获殊荣的技术人成长之路