对于数据量较大的表,在其上进行统计查询一般会效率很低,而且还要考虑统计查询是否会对在线的应用产生负面影响。一般在这种状况下,使用中间表能够提升统计查询的效率。css
首先建立表 session,记录了客户天天的消费记录mysql
CREATE TABLE session ( cust_id varchar(10) , --客户编号 cust_amount DECIMAL(16,2), --客户消费金额 cust_date DATE, --客户消费时间 cust_ip varchar(20) –客户IP 地址 )
因为天天都会产生大量的客户消费记录,因此session 表的数据量很大,如今业务部门有一具体的需求:但愿了解最近一周客户的消费总金额和近一周天天不一样时段用户的消费总金额。针对这一需求咱们经过 2 种方法来得出业务部门想要的结果。sql
方法1:在session 表上直接进行统计,得出想要的结果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,表结构和源表结构彻底相同code
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 种实现方法上看,在中间表中作统计花费的时间不多(这里不计算转移数据花费的时间)。中间表在统计查询中常常会用到,其优势以下:
--中间表复制源表部分数据,而且与源表相“隔离”,在中间表上作统计查询不会对在线应用产生负面影响。
--中间表上能够灵活的添加索引或增长临时用的新字段,从而达到提升统计查询效率和辅助统计查询做用。ip