Mysql 5.6不在子查询中使用索引

时间:2015-06-17 21:50:57

标签: mysql sql

我有一张父母的桌子和一张儿童桌

我的父母表如下:

+----------------+-------------------------------+
|      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。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

所以事实证明,当两个ID字段不是相同的字段类型INT(11)VS时会发生这种情况。 VARCHAR(45)。在应用程序中,表的ID字段之一是奇怪的创建。更新字段类型解决了SQL优化器。

谢谢!

答案 1 :(得分: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;