2013-10-24 120 views
0

我有4個表如下,我想加入這些表,但查詢花了太長時間執行。請告訴我如何優化這個。 使用子查詢我正在基於輸入的日期範圍創建表試圖做下面多連接mysql查詢執行時間太長

1)

2)I需要以組結果基於銀行然後上區,然後通狀態,這樣我可以過濾結果在前端作爲國家 - >區 - >銀行

3)另外我需要避免一些垃圾數據,我正在使用不喜歡條款。

select substring(a.ifsc,1,4) as code, 
     s.new_state as state, 
     s.state_id as stid, 
     d.new_dist as dist, 
     b.ifbank as bank, 
     count(a.amt) as num, 
     sum(a.amt) as amt from 
      (SELECT * FROM mtr where orgdate between '$fdate_new' and '$tdate_new') 
     as a JOIN ifsc b on b.ifscd=a.ifsc 
     JOIN user c on a.excd=c.mtr 
     JOIN state_mapping s on b.state=s.org_state 
     JOIN dist_mapping d on b.dist=d.org_dist 
     where 
      s.state_id ='$stid' and 
      TRIM(d.new_dist) <> '' and 
      d.new_dist IS NOT NULL 
     group by bank,dist order by amt desc; 

dist_mapping表

+----------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+----------+-------------+------+-----+---------+-------+ 
| org_dist | varchar(20) | YES |  | NULL |  | 
| new_dist | varchar(20) | YES |  | NULL |  | 
+----------+-------------+------+-----+---------+-------+ 

IFSC表

+---------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+---------+-------------+------+-----+---------+-------+ 
| ifscd | varchar(11) | NO | PRI |   |  | 
| ifscbr | varchar(40) | YES |  | NULL |  | 
| ifbank | varchar(40) | YES |  | NULL |  | 
| newifsc | varchar(11) | YES |  | NULL |  | 
| dist | varchar(20) | YES |  | NULL |  | 
| state | varchar(20) | YES |  | NULL |  | 
+---------+-------------+------+-----+---------+-------+ 

state_mapping表

+-----------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-----------+-------------+------+-----+---------+-------+ 
| org_state | varchar(20) | YES |  | NULL |  | 
| new_state | varchar(20) | YES |  | NULL |  | 
| state_id | int(2)  | YES |  | NULL |  | 
+-----------+-------------+------+-----+---------+-------+ 

用戶表

+---------+-------------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+---------+-------------+------+-----+---------+-------+ 
| excode | int(2)  | YES |  | NULL |  | 
| mtr | int(2)  | YES |  | NULL |  | 
| exname | varchar(40) | YES |  | NULL |  | 
| country | varchar(10) | YES |  | NULL |  | 
+---------+-------------+------+-----+---------+-------+ 

mysql> desc mtr; 
+---------+---------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+---------+---------------------+------+-----+---------+-------+ 
| excd | int(2)    | NO | PRI | 0  |  | 
| orgdate | date    | YES |  | NULL |  | 
| amt  | double(12,2)  | YES |  | NULL |  | 
| obank | int(1)    | YES |  | NULL |  | 
| brcd | int(5)    | YES |  | NULL |  | 
| brname | varchar(40)   | YES |  | NULL |  | 
| rname | varchar(40)   | YES |  | NULL |  | 
| bname | varchar(40)   | YES |  | NULL |  | 
| baddr | varchar(60)   | YES |  | NULL |  | 
| mob  | varchar(32)   | YES |  | NULL |  | 
| ifsc | varchar(12)   | YES |  | NULL |  | 
+---------+---------------------+------+-----+---------+-------+ 

回答

0

子查詢需要更多的時間比較加盟,請試試這個

select substring(a.ifsc,1,4) as code, 
     s.new_state as state, 
     s.state_id as stid, 
     d.new_dist as dist, 
     b.ifbank as bank, 
     count(a.amt) as num, 
     sum(a.amt) as amt 
     From mtr as a 
     JOIN ifsc b on b.ifscd=a.ifsc and orgdate between '$fdate_new' and '$tdate_new' 
     JOIN user c on a.excd=c.mtr 
     JOIN state_mapping s on b.state=s.org_state 
     JOIN dist_mapping d on b.dist=d.org_dist 
     where 
      s.state_id ='$stid' and `enter code here` 
      TRIM(d.new_dist) <> '' and 
      d.new_dist IS NOT NULL 
     group by bank,dist order by amt desc; 
+0

還是查詢花費同一時間,我需要在任何列上創建索引? – Mani