SQL查询到这么多的时间,需要优化

SQL查询到这么多的时间,需要优化

问题描述:

SELECT LM.user_id,LM.users_lineup_id, min(LM.total_score) AS total_score 
FROM vi_lineup_master LM JOIN 
    vi_contest AS C 
    ON C.contest_unique_id = LM.contest_unique_id join 
    (SELECT min(total_score) as total_score 
     FROM vi_lineup_master 
     GROUP BY group_unique_id 
    ) as preq 
    ON LM.total_score = preq.total_score 
WHERE LM.contest_unique_id = 'iledhSBDO' AND 
     C.league_contest_type = 1 
GROUP BY group_unique_id 

以上查询是要找到每个组的比赛中,查询返回正确的结果,但它不是大data.Needed优化响应请您分享您的解决方案的失败者。提前致谢。SQL查询到这么多的时间,需要优化

+0

运行'explain'并发布查询计划 – Rahul

+0

您是否在连接列上设置了索引? –

+0

添加** contest_unique_id =“iledhSBDO” **进入内部子查询** ** PREQ并 – StanislavL

您可以尝试将您的JOIN s移动到子查询。此外,您应该注意外部查询上的“错误”GROUP BY用法。在Mysql中,您可以按某些列进行分组,并且可以在没有任何聚合函数的情况下选择未在group子句中指定的其他列,但数据库无法确保将返回给您的数据。为了保持应用程序的一致性,将它们包装在一个聚合函数中。

检查这一项帮助:

SELECT 
    MIN(LM.user_id) AS user_id, 
    MIN(LM.users_lineup_id) AS users_lineup_id, 
    MIN(LM.total_score) AS total_score 
FROM vi_lineup_master LM 
WHERE 1=1 
    -- check if this "contest_unique_id" is equals 
    -- to 'iledhSBDO' for a "league_contest_type" valued 1 
    AND LM.contest_unique_id IN 
    (
    SELECT C.contest_unique_id 
    FROM vi_contest AS C 
    WHERE 1=1 
     AND C.contest_unique_id = 'iledhSBDO' 
     AND C.league_contest_type = 1 
) 
    -- check if this "total_score" is one of the 
    -- "min(total_score)" from each "group_unique_id" 
    AND LM.total_score IN 
    (
    SELECT MIN(total_score) 
    FROM vi_lineup_master 
    GROUP BY group_unique_id 
) 
GROUP BY LM.group_unique_id 
; 

而且,这个查询的一些作品看起来是多余的,但它是因为我不想改变你写的过滤器,刚搬到他们。

此外,您的查询逻辑似乎有点怪我的基础上,表/列名,你怎么写的......请查一下我的查询这反映了什么,我理解你的实施意见。

希望它有帮助。

+0

是的,它做了这份工作,并与超过1个lac唱片一起工作........................非常感谢Felypp :) Thankyou所有的建议(y) – user3296832

+0

@ user3296832不客气。不要忘记接受任何答案作为正确的答案。 –