开发者

How can I optimise my MySQL query?

I'm having real difficulties optimising a MySQL query. I have to use the existing database structure, but I am getting an extremely slow response under certain circumstances.

My query is:

SELECT 
    `t`.*,
    `p`.`trp_name`,
    `p`.`trp_lname`,
    `trv`.`trv_prosceslevel`,
    `trv`.`trv_id`,
    `v`.`visa_destcountry`,
    `track`.`track_id`,
    `track`.`track_datetoembassy`,
    `track`.`track_expectedreturn`,
    `track`.`track_status`,
    `track`.`track_comments`
FROM
    (SELECT 
        *
    FROM
        `_transactions`
    WHERE
        DATE(`tr_datecreated`) BETWEEN DATE('2011-07-01 00:00:00') AND DATE('2011-08-01 23:59:59')) `t`
        JOIN
    `_trpeople` `p` ON `t`.`tr_id` = `p`.`trp_trid` AND `p`.`trp_name` = 'Joe' AND `p`.`trp_lname` = 'Bloggs'
        JOIN
    `_trvisas` `trv` ON `t`.`tr_id` = `trv`.`trv_trid`
        JOIN
    `_visas` `v` ON `trv`.`trv_visaid` = `v`.`visa_code`
        JOIN
    `_trtracking` `track` ON `track`.`track_trid` = `t`.`tr_id` AND `p`.`trp_id` = `track`.`track_trpid` AND `trv`.`trv_id` = `track`.`track_trvid` AND `track`.`track_status` IN ('New','Missing_Info',
        'En_Route',
        'Ready_Pickup',
        'Received',
        'Awaiting_Voucher',
        'Sent_Client',
        'Closed')
ORDER BY `tr_id` DESC

The results of an explain statement on the above is:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   PRIMARY     <derived2>  ALL     NULL    NULL    NULL    NULL    164     Using temporary; Using filesort

1   PRIMARY     track   ALL     status_index    NULL    NULL    NULL    4677    Using where

1   PRIMARY     p   eq_ref  PRIMARY     PRIMARY     4   db.track.track_trpid    1   Using where

1   PRIMARY     trv     eq_ref  PRIMARY     PRIMARY     4   db.track.track_trvid    1   Using where

1   PRIMARY     v   eq_ref  visa_code   visa_code   4   db.trv.trv_visaid   1   

2   DERIVED     _transactions   ALL     NULL    NULL    NULL    NULL    4276    Using where

The query times are acceptable until the value of 'Closed' is included in the very last track.track_status IN clause. The length of time is then increased about 10 to 15 times the other queries.

This makes sense as the 'Closed' status refers to all the clients whose transactions have been dealt with, wihich corresponds to about 90% to 95% of the database.

The issue is, is that in some cases, the search is taking about 45 seconds which is rediculous. I'm sure MySQL can do much better than that and it's just my query at fault, even if the tables do have 4000 rows, but I can't work out how to optimise this statement.

I'd be grateful for some开发者_Go百科 advice about where I'm going wrong and how I should be implementing this query to produce a faster result.

Many thanks


Try this:

SELECT t.*, 
p.trp_name, 
p.trp_lname, 
trv.trv_prosceslevel, 
trv.trv_id,
v.visa_destcountry, 
track.track_id, 
track.track_datetoembassy,
track.track_expectedreturn, 
track.track_status, 
track.track_comments 
FROM 

_transactions t
JOIN _trpeople p ON t.tr_id = p.trp_trid
JOIN _trvisas trv ON t.tr_id = trv.trv_trid 
JOIN _visas v ON trv.trv_visaid = v.visa_code 
JOIN _trtracking track ON track.track_trid = t.tr_id 
AND p.trp_id = track.track_trpid 
AND trv.trv_id = track.track_trvid 
WHERE DATE(t.tr_datecreated) 
    BETWEEN DATE('2011-07-01 00:00:00') AND DATE('2011-08-01 23:59:59')

    AND track.track_status IN ('New','Missing_Info','En_Route','Ready_Pickup','Received','Awaiting_Voucher','Sent_Client', 'Closed') 
    AND p.trp_name = 'Joe' AND p.trp_lname = 'Bloggs' 
ORDER BY tr_id DESC 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜