mysql - 如何优化我的 MySQL 查询?

标签 mysql

我在优化 MySQL 查询时遇到了真正的困难。我必须使用现有的数据库结构,但在某些情况下我得到的响应非常慢。

我的查询是:

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

上面解释语句的结果是:

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

在最后一个 track.track_status IN 子句中包含“Closed”的值之前,查询时间是可以接受的。然后,时间长度增加了其他查询的大约 10 到 15 倍。

这是有道理的,因为“已关闭”状态指的是所有交易已处理的客户,相当于数据库的大约 90% 到 95%。

问题是,在某些情况下,搜索大约需要 45 秒,这是荒谬的。我确信 MySQL 可以做得更好,这只是我的查询有问题,即使表确实有 4000 行,但我不知道如何优化这个语句。

如果您能就我哪里出错以及我应该如何实现此查询以产生更快的结果提供一些建议,我将不胜感激。

非常感谢

最佳答案

试试这个:

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 

关于mysql - 如何优化我的 MySQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7069141/

相关文章:

mysql - 使用现有数据更改数据库编码

mysql - 访问被拒绝;您需要在 sql 查询浏览器中执行此操作的 super 权限

mysql - 在对列求和时加入/合并

MySQL 是否可以在 LIMIT 语法之后进行子查询?如果不是,为什么?

php - Laravel SQLSTATE[HY000] : General error: 1364 Field 'id' doesn't have a default value

php - Laravel HasManyThrough 与 3 向数据透视表

mysql - 使用 Django 将 pandas Dataframe 加载到 sql 数据库中

mysql - SQL从另一个表返回带有图片计数的用户列表

c# - 将 SQL 的结果除以单独的 List <int>

mysql - 这个mysql触发器定义有什么问题?