mysql 数据库 分表后 怎么进行分页查询?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 数据库 分表后 怎么进行分页查询?相关的知识,希望对你有一定的参考价值。
mysql 分页最简单了. SELECT * FROM Account WHERE (usertype='base' or usertype='home' or usertype='salse') and logindate is not null order by logindate desc LIMIT 起始行, 每页多少行 LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1) 参考技术A 1.如果只是为了分页,可以考虑这种分表,就是表的id是范围性的,且id是连续的,比如第一张表id是1到10万,第二张是10万到20万,这样分页应该没什么问题。2.如果是其他的分表方式,建议用sphinx先建索引,然后查询分页,我们公司现在就是这样干的
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 ;
- 1
- 2
- 3
- 4
- 5
- 6
表二:
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 ;
- 1
- 2
- 3
- 4
- 5
- 6
接下来开始进行拆分:
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;
- 1
- 2
数据被分为:
这时候表基本是已经拆分完成。
接下来,我们需要考虑的是一张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 ;
- 1
- 2
- 3
- 4
- 5
- 6
执行上述出现如下问题:
ERROR 1168 (HY000): Unable to open underlying table which is differently defined
or of non-MyISAM type or doesn't exist
- 1
- 2
需要检查:
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表去做分页查询实现
测试结果:
以上是关于mysql 数据库 分表后 怎么进行分页查询?的主要内容,如果未能解决你的问题,请参考以下文章