加入收藏 | 设为首页 | 会员中心 | 我要投稿 92站长网 (https://www.92zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2022-11-18 13:08:45 所属栏目:MySql教程 来源:未知
导读: 随着项目运行的时间越来越长,有些数据的存储也会越来越大,比如一些点击量,浏览量量,单表的数据可以到达上千万条数据,这时候会存在单表数据过大,查询效率低的问题。
为了提高查询效率

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

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

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

mysql 分页_mysql分页_oracle分页和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;

数据被分为:

oracle分页和mysql分页_mysql 分页_mysql分页

mysql 分页_oracle分页和mysql分页_mysql分页

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

接下来,我们需要考虑的是一张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

oracle分页和mysql分页_mysql分页_mysql 分页

or?of?non-MyISAM?type?or?doesn't?exist

需要检查:

查看上面的分表数据库引擎是不是MyISAM.

查看分表与指标的字段定义是否一致。

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

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

oracle分页和mysql分页_mysql 分页_mysql分页

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

mysql 分页_oracle分页和mysql分页_mysql分页

mysql 分页_mysql分页_oracle分页和mysql分页

oracle分页和mysql分页_mysql 分页_mysql分页

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

java代码实现:

oracle分页和mysql分页_mysql分页_mysql 分页

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

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

mysql 分页_oracle分页和mysql分页_mysql分页

mysql分页_oracle分页和mysql分页_mysql 分页

mysql分页_mysql 分页_oracle分页和mysql分页

测试结果:

mysql分页_mysql 分页_oracle分页和mysql分页

(编辑:92站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!