對於數據量較大的表,在其上進行統計查詢一般會效率很低,而且還要考慮統計查詢是否會對在線的應用產生負面影響。一般在這種狀況下,使用中間表能夠提升統計查詢的效率。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