Redian新闻
>
MySQL分表后,如何做分页查询?

MySQL分表后,如何做分页查询?

公众号新闻

点击关注公众号,Java干货及时送达👇

来源:blog.csdn.net/joy_tom/article/details/109857573


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

为了提高查询效率这时候需要对单表进行拆分,比如一张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表去做分页查询实现

图片

图片

图片

测试结果:

(完)

码农突围资料链接

1、卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
2、计算机基础知识总结与操作系统 PDF 下载
3、艾玛,终于来了!《LeetCode Java版题解》.PDF
4、Github 10K+,《LeetCode刷题C/C++版答案》出炉.PDF

欢迎添加鱼哥个人微信:smartfish2020,进粉丝群或围观朋友圈

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
MySQL中的 utf8 并不是真正的UTF-8编码 ! !21 个 MySQL 表设计的经验准则保利联手碧桂园,为什么要做分布式光伏?MySQL长期霸榜时代结束!Netflix游戏副总裁采访:流媒体巨头Netflix为何做游戏、如何做?CEDEC | HAL分享:《星之卡比》自动化地形生成系统如何做的?SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮面试官:MySQL中的 distinct 和 group by 哪个效率更高?专访“MySQL 之父”:我曾创造 MySQL,也将颠覆 MySQL虽在异乡非异客 且把他乡作故乡 上云中的 MySQL 是 DBA 的终结吗?SQLAlchemy 2.0.0发布首个RC,Python ORM框架资本家只用鞍钢宪法中部分内容为什么不建议在 MySQL 中使用 UTF-8 ?源码学习之MyBatis的底层查询原理干掉 Oracle 的 MySQL的高端玩法,真香!MariaDB 成功上市!MySQL 之父 YYDS!!小儿腹泻更新MySQL索引下推知识分享Mybatis 框架下 SQL 注入审计分析MySQL 最朴素的监控方式!用完爱不释手MySQL 5.7 并行复制实现原理与调优[荐书]:搞懂 MySQL 隔离级别11 款超赞的 MySQL 图形化工具,好用!13 款炫酷的 MySQL 可视化管理工具!如何开展远程心理咨询?这3件事你需要提前知道总结 mysql 的所有 buffer,一网打尽就这篇了!BUG退退退:搞懂MySQL隔离级别 | 文末赠书面试官:为什么不建议在 MySQL 中使用 UTF-8 ?MySQL客户端的进阶操作MySQL 分布式事务的“路”与“坑”一个人的徒步,900公里法国之路+世界尽头:D44~最好的生日礼物见到真贵族!清宫剧都弱爆了(图)“吊打” ClickHouse,火山引擎数仓 SQL 查询性能 10x 提升!设计糟糕的分库分表是如何把系统搞挂的?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。