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

标签 mysql sql

我有一张 parent 表和一张 child 表

我的 parent 表如下:

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

我的 children 的 table 是:

+----------+-------------------------------+-----------+-----+
| 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;

我的问题是,当我执行此查询时( parent 有 13,000 条记录, child 有 21,000 条记录)children 中的 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 时,就会发生这种情况。变量(45)。在应用程序中,奇怪地创建了表的 ID 字段之一。更新字段类型解决了 SQL 优化器问题。

谢谢!

关于Mysql 5.6 不在子查询中使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903023/

相关文章:

mysql - 连接多个 mysql 表中的数据

php - 将explode与php和mysql一起使用

sql - 查看任何定义、查看服务器状态的风险

mysql - 保持连接 - mysql

php - Buddypress 自定义事件循环和查询功能

php - mysqli::real_escape_string 的对应物?

php - API Laravel 中的 JSON 列添加而不是插入

sql - 需要有关返回符合特定条件的最后记录的 SQL 查询的帮助

mysql - 根据特定值选择行组合

mysql - SQL仅选择列上具有最大值的行