当前位置:嗨网首页>书籍在线阅读

05-使用中间表提高统计查询速度

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

对于数据量较大的表,在其上进行统计查询通常会效率很低,并且还要考虑统计查询是否会对在线的应用产生负面影响。通常在这种情况下,使用中间表可以提高统计查询的效率,下面通过对session表的统计来介绍中间表的使用。

(1)session表记录了客户每天的消费记录,表结构如下:

CREATE TABLE session (

cust_id varchar(10) , --客户编号

cust_amount DECIMAL(16,2), --客户消费金额cust_date DATE, --客户消费时间

cust_ip varchar(20) --客户IP地址

)

(2)由于每天都会产生大量的客户消费记录,所以 session 表的数据量很大,现在业务部门有一具体的需求:希望了解最近一周客户的消费总金额和近一周每天不同时段用户的消费总金额。针对这一需求我们通过2种方法来得出业务部门想要的结果。

方法1:在session表上直接进行统计,得出想要的结果。

mysql> select sum(cust_amount) from session where cust_date>adddate(now(),-7);

+------------------+

| sum(cust_amount) |

+------------------+

|161699200.64 |

+------------------+

1 row in set (3.95 sec)

方法2:创建中间表tmp_session,表结构和源表结构完全相同。

CREATE TABLE tmp_session (

cust_id varchar(10) , --客户编号

cust_amount DECIMAL(16,2), --客户消费金额

cust_date DATE, --客户消费时间

cust_ip varchar(20) –客户IP地址

) ;

转移要统计的数据到中间表,然后在中间表上进行统计,得出想要的结果。

mysql> insert into tmp_session select * from session where cust_date> adddate (now(),-7);

Query OK, 1573328 rows affected (6.67 sec)

Records: 1573328 Duplicates: 0 Warnings: 0

mysql> select sum(cust_amount) from tmp_session;

+------------------+

| sum(cust_amount) |

+------------------+

| 161699200.64 |

+------------------+

1 row in set (0.73 sec)

从上面的2种实现方法上看,在中间表中做统计花费的时间很少(这里不计算转移数据花费的时间),另外,针对业务部门想了解“近一周每天不同时段用户的消费总金额”这一需求,在中间表上给出统计结果更为合适,原因是源数据表(session表)cust_date字段没有索引并且源表的数据量较大,所以在按时间进行分时段统计时效率很低,这时可以在中间表上对cust_date字段创建单独的索引来提高统计查询的速度。

中间表在统计查询中经常会用到,其优点如下:

中间表复制源表部分数据,并且与源表相“隔离”,在中间表上做统计查询不会对在线应用产生负面影响;

中间表上可以灵活地添加索引或增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询作用。