备份表多表分页查询方法。

问题产生背景:

项目当中有个表数据量很大,超过几千万的数据存储,数据如果存储在单表上,查询、插入和清理(delete)的效率非常低下,打算进行改造。分析下来可以采用数据库大表存储方案和分表存储方案,考虑到数据库的通用性,最后采用分表存储。分表存储是非常简单的,达到一定时间后创建相同的新表进行存储就行了。但这样分表后产生了一个新问题的,如何进行多表的分页?

关于多表分页查询要解决的问题:

如何像单表一样进行多表的查询?

首先我们先来看看单表查询如何来做,mysql为例。

假如有一张表的数据结构如下:

表名:testuser

140526_EDv7_184206.png

单表分页查询:select * from testuser limit 0,2

解释:查询testuser表从0开始,2条记录

结果:140703_bW53_184206.png

创建一个新的相同的表:testuser_02

140717_yHVk_184206.png

多表查询的话需要将多个表的数据集合并起来,这里需要用到union all方法。

注意:union也可以,但是union会比较排除相同字段而union all不会进行比较,因此合并的时候union效率较低。

多表分页语句:(select * from testuser) union all (select * from testuser_02) limit 0,2

解释:查询testuser数据,查询testuser_02数据,然后进行合并,合并后取行数0开始的2条记录

140732_BmJl_184206.png

如果需要添加where字句的话只要在每个表查询中添加相应的语句即可。

分表的效率问题?

我们看到上面的分表分页虽然是成功的,但是当表的数据变大的时候,查询速度明显下降。

我们将testuser和testuser_02的数据量提升到64w条和8w条。

同样的sql语句查询速度:

140751_vTqo_184206.png

我们看到需要1.81秒,明显速度变慢,如果数据量越来越大,则会更慢。

调整查询语句,在每个sql中添加分页,最终再进行分页:

(select * from testuser limit 0,2) union all (select * from testuser_02 limit 0,2) limit 0,2

140801_sBs3_184206.png

速度明显快了很多,因为采用了子分页再总分页的方式,只是多计算了一次分页而已。

什么时候跨表查询?

可以采用备份表的方式,将表备份后,记录备份表的信息,存储的时间点,数量等。

查询一般按照时间来跨表,这样进行查询的时候根据时间判断是否需要进行多个表的关联查询即可。


最后需要注意表的分页算法:

164655_FSSZ_184206.png



转载于:https://my.oschina.net/u/184206/blog/367561

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值