簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM