今天遇到一个爬虫业务,爬虫每天会定期爬取百度的数据,然后放到一个分表里面,每天爬取到的数据大概有3~4百万的级别。分表的后缀名就是当天的日期,
比如table_name_20170215,table_name_20170216
其中有一个功能,需要我每隔30s去查询爬取数据的总数,原本是极为简单的操作,直接调用count函数统计一下数据就行了,但是我们的数据分布到多张表里面
这个时候就有点蛋疼了。表有多少张,我们是不清楚的,它随着日期的推进而增加。如何确定的情况下,我们可以使用sum,count函数结合union all来查询数据的总和。
比如:
select sum(tmpCount) from
(select count() as tmpCount from table_20170215 union all select count() as tmpCount from table_20170216) as a
解决的思路就是以某一天为基准,比如说2017-02-15这一天开始执行的任务,我们在2017-02-19这一天执行统计,这个时候我们需要计算出开始的那一天
到2017-02-19一共的天数,通过程序的判断拼接成相应的SQL语句,这样就可以解决问题了,下面给出了mybatis的例子:
<select id="countCurrentCompletedAggs" parameterType="java.util.List" resultType="java.lang.Long">
SELECT SUM(tmpCount) FROM (
<foreach collection="tableNames" item="tableName" index="index">
<choose>
<when test="index == 0">
SELECT COUNT(*) as tmpCount FROM ${tableName}
</when>
<otherwise>
UNION ALL
SELECT COUNT(*) as tmpCount FROM ${tableName}
</otherwise>
</choose>
</foreach>
) as agg
</select>