优化慢速SQL查询

时间:2013-12-20 11:31:36

标签: mysql query-optimization recursive-query

我有一个查询,它使用MySQL作为其数据库。现在我疯狂地说为什么花了11分钟来渲染结果,我在桌面上喜欢7K +记录并运行递归子查询(?),我不完全确定这是否会占用内存但是如果你可以看看并给出一些补救措施,以便如何进行优化我会非常高兴和满足......

我的目标是压缩相对于某个人的记录......并根据完成的时间对它们进行排名。

表格结构:

CREATE TABLE `temptbl_raceeventresult_step1` (
`RunCatEventId` INT(11) NOT NULL,
`RunEventId` INT(11) NOT NULL,
`CategoryId` INT(11) NOT NULL,
`FullName` VARCHAR(255) NOT NULL,
`BIB` INT(11) NOT NULL,
`Category` DECIMAL(16,3) NOT NULL,
`Ord` INT(11) NOT NULL,
`TransitionId` INT(11) NOT NULL,
`Time` DATETIME NOT NULL)
COLLATE='latin1_swedish_ci'ENGINE=MyISAM;

//查询

SELECT
UCASE(g1.Name) Name
,g1.BIB
,g1.TimeDerived
,g1.CategoryName
,g1.TotalPace
,g1.Category
,COUNT(*) AS rank
FROM
(
    SELECT 
        a.FullName Name, 
        a.RunCatEventId, 
        a.RunEventId, 
        a.CategoryId, 
        a.BIB, 
        a.Category, 
        a.Ord, 
        a.TransitionId,
        SEC_TO_TIME(SUM(TIME_TO_SEC(Time) - (SELECT TIME_TO_SEC(Time) TimeMinuend FROM temptbl_raceeventresult_step1 WHERE BIB = a.bib AND (Ord + 1) = a.Ord AND CategoryId = a.CategoryId))) TimeDerived,
        SEC_TO_TIME(SUM(TIME_TO_SEC(Time) - (SELECT TIME_TO_SEC(Time) TimeMinuend FROM temptbl_raceeventresult_step1 WHERE BIB = a.bib AND (Ord + 1) = a.Ord AND CategoryId = a.CategoryId)) / a.Category) TotalPace                              
    FROM temptbl_raceeventresult_step1 a                                      
    JOIN (SELECT @cat:=null) xyz
    GROUP BY a.RunCatEventId, a.RunEventId, a.CategoryId, a.FullName, a.BIB
) g1
JOIN
(
    SELECT 
        a.FullName Name, 
        a.RunCatEventId, 
        a.RunEventId, 
        a.CategoryId, 
        a.BIB, 
        a.Category, 
        a.Ord, 
        a.TransitionId,
        SEC_TO_TIME(SUM(TIME_TO_SEC(Time) - (SELECT TIME_TO_SEC(Time) TimeMinuend FROM temptbl_raceeventresult_step1 WHERE BIB = a.bib AND (Ord + 1) = a.Ord AND CategoryId = a.CategoryId))) TimeDerived,
        SEC_TO_TIME(SUM(TIME_TO_SEC(Time) - (SELECT TIME_TO_SEC(Time) TimeMinuend FROM temptbl_raceeventresult_step1 WHERE BIB = a.bib AND (Ord + 1) = a.Ord AND CategoryId = a.CategoryId)) / a.Category) TotalPace                              
    FROM temptbl_raceeventresult_step1 a                                      
    JOIN (SELECT @cat:=null) xyz
    GROUP BY a.RunCatEventId, a.RunEventId, a.CategoryId, a.FullName, a.BIB
) g2
ON (g2.TimeDerived, g2.bib) <= (g1.TimeDerived, g1.bib) AND g1.Category = g2.Category

WHERE g2.Category = 5 AND g1.RunEventId = 3

GROUP BY g1.Name
,g1.BIB
,g1.TimeDerived
,g1.CategoryName
,g1.TotalPace
,g1.Category
ORDER BY g1.Category, rank

0 个答案:

没有答案
相关问题