基于Mysql优化解释

时间:2013-11-27 17:11:40

标签: mysql sql join indexing explain

我有以下查询需要很长时间才能执行。我需要加快速度,但是我不知道要使用什么技术。这是查询:

SELECT 
    `User`.`id`, 
    `User`.`username`, 
    `User`.`password`, 
    `User`.`role`, 
    `User`.`created`, 
    `User`.`modified`, 
    `User`.`email`, 
    `User`.`other_user_id`, 
    `User`.`first_name`, 
    `User`.`last_name`, 
    `User`.`place_id`, 
    `Resume`.`id`, 
    `Resume`.`user_id`, 
    `Resume`.`other_resume_id`, 
    `Resume`.`other_user_id`, 
    `Resume`.`file_extension`, 
    `Resume`.`created`, 
    `Resume`.`modified`, 
    `Resume`.`is_deleted`, 
    `Resume`.`has_file`, 
    `Resume`.`is_stamped`, 
    `Resume`.`is_active` 
FROM 
    `streetofwalls`.`users` AS `User` 
    LEFT JOIN `my_database`.`attempts` AS `Attempt` 
        ON (`Attempt`.`user_id` = `User`.`id` AND `Attempt`.`test_id` != 5) 
    LEFT JOIN `my_database`.`reports` AS `Resume` 
        ON (`Resume`.`user_id` = `User`.`id`) 
WHERE 
    `Attempt`.`test_id` = 8 
    AND `Attempt`.`score` > 60 
    AND `User`.`id` IN (
        SELECT 
            `User1`.`id` 
        FROM 
            `my_database`.`users` AS User1 
            LEFT JOIN `my_database`.`tags_users` AS TagUser 
                ON (`User1`.`id`= `TagUser`.`user_id`) 
            LEFT JOIN `my_database`.`tags` AS Tag 
                ON (`TagUser`.`tag_id`= `Tag`.`id`) 
        WHERE `Tag`.`id` = (8) ) 
    AND `User`.`id` NOT IN (
        SELECT 
            `User1`.`id` 
        FROM 
            `my_database`.`users` AS User1 
            LEFT JOIN `my_database`.`tags_users` AS TagUser 
                ON (`User1`.`id`= `TagUser`.`user_id`) 
            LEFT JOIN `my_database`.`tags` AS Tag 
                ON (`TagUser`.`tag_id`= `Tag`.`id`) 
        WHERE `Tag`.`id` = (3) ) 
    AND `Resume`.`has_file` = 1 
GROUP BY `User`.`id` 
ORDER BY `Attempt`.`score` DESC;

此查询生成以下说明: explain for the above query

如您所见,我在此查询中有几个索引。目前只有简历表无法编入索引。是否可以在此查询的上下文中索引此表?有没有其他方法来加快这个我没想过的查询?它的预期功能令人望而却步,而且我没有想法。感谢任何能提供帮助的人。如果需要任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

尝试内部联接而不是子查询 它默认指导查询而不运行数据,但可能跟随查询将帮助您。

选择UseridUserusernameUserpasswordUser。{{1} },roleUsercreatedUsermodifiedUseremailUserother_user_idUserfirst_nameUserlast_nameUserplace_idResume,{{ 1}}。idResumeuser_idResumeother_resume_idResumeother_user_id,{{1} }。Resumefile_extensionResumecreatedResumemodifiedResumeis_deletedResumehas_fileResume

这     is_stampedResume AS is_active
LEFT JOIN streetofwallsusers AS User ON(my_databaseattempts = AttemptAttemptuser_idUser!= 5) LEFT JOIN idAttempt AS test_id ON(my_databasereports = ResumeResume

user_idUser AS User1

LEFT JOIN idmy_database AS TagUser on {usersmy_database = tags_usersUser1

LEFT JOIN idTagUser AS代码开启(user_idmy_database = tagsTagUser

WHERE     tag_idTag = idUser     和idUser1 = 8     和idAttempt> 60个
    和test_idAttempt = 1     和scoreResume ='8'和has_fileTag!='3' GROUP BY idTag ORDER BY idUser DESC;