无法通过连接查询使mysql使用为表构建的索引

时间:2013-11-27 19:37:56

标签: 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`.`school_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 
    `dataplace`.`users` AS `User` 
    LEFT JOIN `dataplace`.`attempts` AS `Attempt` 
        ON (`Attempt`.`user_id` = `User`.`id` AND `Attempt`.`test_id` != 5) 
    LEFT JOIN `dataplace`.`resumes` AS `Resume` 
        ON (`Resume`.`user_id` = `User`.`id`) 
WHERE 
    `Resume`.`has_file` = 1 
GROUP BY `User`.`id` 
ORDER BY `Attempt`.`score` DESC;

此查询生成以下说明:

+----+-------------+---------+--------+---------------+---------------+---------+------------------------------+-------+----------------------------------------------+
| id | select_type | table   | type   | possible_keys | key           | key_len | ref                          | rows  | Extra                                        |
+----+-------------+---------+--------+---------------+---------------+---------+------------------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | Resume  | ALL    | user_id_index | NULL          | NULL    | NULL                         | 18818 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | User    | eq_ref | PRIMARY       | PRIMARY       | 4       | dataplace.Resume.user_id     |     1 | Using where                                  |
|  1 | SIMPLE      | Attempt | ref    | user_id_index | user_id_index | 5       | dataplace.User.id            |     1 |                                              |
+----+-------------+---------+--------+---------------+---------------+---------+------------------------------+-------+----------------------------------------------+

简历表有4个独立的索引,如下所示:

PRIMARY id
user_id_index
other_resume_id_index
other_user_id_index

基于此,我希望来自简历表的user_id索引可以与有问题的查询一起使用,但事实并非如此。这可能是订购的问题吗?还有其他原因导致该指数未被使用吗?不同的指数会更好地为我服务吗?我不确定?感谢任何有帮助的人。

1 个答案:

答案 0 :(得分:1)

你基本上没有有用的WHERE子句,因为你所拥有的条件适用于最后一个连接表,并且可以移动到最后一个连接的连接条件。

Users表是第一个访问的表(它在FROM子句中首先命名),并且没有用户条件,因此必须访问所有行 - 没有索引可以帮助那些。