当前位置:   article > 正文

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

mysql分表后如何分页

b092d2750ad7580412aabb93436a91f9.jpeg

程序员的成长之路

互联网/程序员/技术/资料共享 

关注

阅读本文大概需要 2.8 分钟。

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

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

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

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

b5db7e633fa38e496bb5d81950f0cb43.png

图片

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

第一步:

表一:

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

表二:

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

接下来开始进行拆分:

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

数据被分为:

d7eee207e87ff28de6efd82e29b37736.png

图片

f760bf700e033ec8f7114c286c72336b.png

图片

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

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

第一步:

创建一个主表:

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

执行上述出现如下问题:

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

需要检查:

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

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

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

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

f6ffedcf20fbce48f563d5bc64c64b7d.png

图片

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

c53c5cf571e6191b928eed892084ee42.png

图片

42b44bdea2cd0980021aaa7ea94f7aba.png

图片

514cd4d69a767cf848c7e9f5dbe0a91d.png

图片

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

java代码实现:

ee54509cd75420d7b228fd8a19c86cfb.png

图片

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

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

ebc5d30e64036ff95b382c506804f378.png

图片

0953f03f35d6bc656e46a518dbc4945f.png

图片

df1556f5f4aa5139f6bf859c55bfd65c.png

图片

测试结果:

af69045628c699a5f0f1e33024ca2542.png

<END>

推荐阅读:

为了随时能敲代码,我用树莓派手搓一台 Linux 掌上电脑

图解 Redis,还有人看不懂?

  1. 互联网初中高级大厂面试题(9个G)
  2. 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
  3. ⬇戳阅读原文领取!                                  朕已阅
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/49415
推荐阅读
相关标签
  

闽ICP备14008679号