当前位置: 欣欣网 > 码农

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

2024-02-23码农

点击关注公众号,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_member1 tb_member2 的并集,刚刚实现到这里,我也没理解,后来看了一些文档,了解了一下:

图片

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

图片

图片

图片

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

java代码实现:

图片

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

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

图片

图片

图片

测试结果:

END


看完本文有收获?请转发分享给更多人

关注「Java编程鸭」,提升Java技能

关注Java编程鸭微信公众号,后台回复:码农大礼包可以获取最新整理的技术资料一份。涵盖Java 框架学习、架构师学习等

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)