我有一张父母的桌子和一张儿童桌
我的父母表如下:
+----------------+-------------------------------+
| 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。有什么想法吗?
答案 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;