2013-10-24 121 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