2015-06-17 2 views
1

У меня есть таблица родителей и стол детейMysql 5.6 не использует индекс в подзапроса

Мои родители таблица выглядит следующим образом:

+----------------+-------------------------------+ 
|  parent_id | parent_name     | 
+----------------+-------------------------------+ 
|   10792 | Katy       | 
|   7562 | Alex       | 
|   13330 | Drew       | 
|   9153 | Brian      | 
+----------------+-------------------------------+ 

моих детей таблица:

+----------+-------------------------------+-----------+-----+ 
| child_id | child_name     | parent_id | age | 
+----------+-------------------------------+-----------+-----+ 
|  1 | Matthew      |  10792 | 4 | 
|  2 | Donald      |  9153 | 5 | 
|  3 | Steven      |  10792 | 9 | 
|  4 | John       |  7562 | 6 | 
+----------+-------------------------------+-----------+-----+ 

При использовании суб-выбора, такие как:

SELECT parent_name, (SELECT SUM(age) FROM children WHERE parent_id = parents.parent_id) AS combined_age FROM parents; 

Моя проблема заключается в том, что когда я выполняю этот запрос (у родителей 13 000 записей, у детей - 21 000 записей), индекс parent_id в детей не используется, как показано в плане объяснения. Я получаю:

+----+--------------------+--------------------------+--------+---------------+------+---------+-------+-------+-------------------------------------------------+ 
| id | select_type  | table     | type | possible_keys | key | key_len | ref | rows | Extra           | 
+----+--------------------+--------------------------+--------+---------------+------+---------+-------+-------+-------------------------------------------------+ 
| 1 | PRIMARY   | parents     | ALL | NULL   | NULL | NULL | NULL | 13548 | NULL      
| 2 | DEPENDENT SUBQUERY | children     | ALL | PARENTS,AGE | NULL | NULL | NULL | 21654 | Range checked for each record (index map: 0x22) | 
+----+--------------------+--------------------------+--------+---------------+------+---------+-------+-------+-------------------------------------------------+ 

Этот запрос принимает в течение 3 минут, чтобы бежать, и я не могу показаться, чтобы получить подзапрос использовать индекс для запроса, где дети принадлежат к родителю. Я пробовал USE INDEX и FORCE INDEX, а также USE KEY AND FORCE KEY. Есть идеи?

ответ

1

Так Оказывается, это происходит, когда два поля ID не тот же тип поля INT (11) VS. VARCHAR (45). В приложении одно из полей идентификатора таблицы было создано странным образом. Обновление типа поля позволило решить оптимизатор SQL.

Спасибо!

0

Индекс должен использоваться. Оптимальным показателем будет children(parent_id, age).

Вы можете попробовать переписывания запрос как join:

select p.parent_name, sum(c.age) 
from parents p left join 
    children c 
    on p.parent_id = c.parent_id 
group by p.parent_name; 
Смежные вопросы