[英]Mysql 5.6 not using index in subquery
我有一張父母的桌子和一張孩子的桌子
我的父母表如下:
+----------------+-------------------------------+
| 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 和 FORCE KEY。 有任何想法嗎?
所以事實證明,當兩個 ID 字段不是相同的字段類型 INT(11) VS 時,就會發生這種情況。 VARCHAR(45)。 在應用程序中,奇怪地創建了表的 ID 字段之一。 更新字段類型解決了 SQL 優化器。
謝謝!
應該使用索引。 最佳索引是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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.