备份表多表分页查询方法

pbd4 9年前

问题产生背景:

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

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

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

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

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

表名:testuser

备份表多表分页查询方法

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

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

结果:备份表多表分页查询方法

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

备份表多表分页查询方法

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

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

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

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

备份表多表分页查询方法

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

分表的效率问题?

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

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

同样的sql语句查询速度:

备份表多表分页查询方法

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

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

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

备份表多表分页查询方法

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

什么时候跨表查询?

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

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


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

164655_fssz_184206.png