2011-04-26 121 views
1

下面的查询是采取很长的执行:优化MySQL查询

SELECT HISTORY.VERSION_ID 
    , HISTORY.ACTION 
    , HISTORY.STATUS 
    , HISTORY.APP_INSTANCE 
    , HISTORY.ACTION_TIMESTAMP 

FROM 
    HISTORY 
WHERE 
    HISTORY.HISTORY_ID IN (SELECT max(H.HISTORY_ID) AS expr1 FROM HISTORY H GROUP BY H.VERSION_ID) 

GROUP BY 
    HISTORY.VERSION_ID 
, HISTORY.ACTION 
, HISTORY.STATUS 
, HISTORY.APP_INSTANCE 

, HISTORY.ACTION_TIMESTAMP 

表相关的其他重要的事情是:

表:

Field    Type  Null Key Default  Extra 

HISTORY_ID   bigint(20) NO PRI (null)  auto_increment 
VERSION_ID   bigint(20) YES MUL (null) 
ACTION    varchar(50) YES  (null) 
STATUS    varchar(100) YES  (null) 
ACTION_TIMESTAMP  timestamp NO  CURRENT_TIMESTAMP 
APP_INSTANCE   varchar(50) YES  (null) 
TIME_TO_COMPLETE_PROCESS bigint(35) YES  (null) 

指标:

HISTORY 0 PRIMARY   1 HISTORY_ID A 89 (null) (null)  BTREE 

HISTORY 1 FK_HISTORY  1 VERSION_ID A 44 (null) (null) YES BTREE 

说明在查询中:

1 PRIMARY   HISTORY  ALL (null) (null)  (null) (null) 472468 Using where; Using temporary; Using filesort 

2 DEPENDENT SUBQUERY H  index (null) FK_HISTORY 9 (null) 6 Using index 

请帮我优化查询。

感谢, 萨钦

+0

你可以发布查询的结果......我相信它只会返回一条记录。虽然不清楚,但我怀疑如此。请发布结果以清除疑问,以便我可以进一步帮助您 – 2011-04-26 09:36:37

+0

不,该查询不返回仅一条记录。它正在返回约5万条记录。让我知道你是否想查看一些结果。 – Sachin 2011-04-26 10:06:42

回答

2
SELECT h.VERSION_ID, 
     h.ACTION, 
     h.STATUS, 
     h.APP_INSTANCE, 
     h.ACTION_TIMESTAMP 
FROM (
     SELECT MAX(history_id) AS mid 
     FROM history 
     GROUP BY 
       version_id 
     ) q 
JOIN history h 
ON  h.history_id = q.mid 

这个创建于(version_id, history_id)复合指数快速地工作。

+0

感谢您的回应Quassnoi。不幸的是,您提出的查询没有性能改进。 – Sachin 2011-04-26 10:05:34

+0

@Sachin:这个查询返回什么:'SELECT COUNT(*),COUNT(DISTINCT version_id)FROM history'?另外,请按照更新后的建议创建一个复合索引。 – Quassnoi 2011-04-26 10:08:04

+0

选择查询的结果:+ ---------- + -------------------------------- ---- + | count(*)|计数(DISTINCT CS_File_version_id)| + ---------- + ------------------------------------ + | 472468 | 81941 | + ---------- + ------------------------------------ + 我也创建了索引。 – Sachin 2011-04-26 10:34:41