在MySQL中,此查询是否使用索引?

在MySQL中,此查询是否使用索引?,mysql,database,indexing,Mysql,Database,Indexing,我不确定这个查询是否使用索引。 我怎么说 mysql> EXPLAIN SELECT au.* FROM users au WHERE au.id IN(SELECT fa.from_user_id FROM approvals fa INNER JOIN personas pp ON fa.persona_id = pp.id WHERE fa.to_user_id=1 AND pp.is_foundation=1 GROUP BY fa.from_user_id) ORDER BY i

我不确定这个查询是否使用索引。 我怎么说

mysql> EXPLAIN SELECT au.* FROM users au WHERE au.id IN(SELECT fa.from_user_id FROM approvals fa INNER JOIN personas pp ON fa.persona_id = pp.id WHERE fa.to_user_id=1 AND pp.is_foundation=1 GROUP BY fa.from_user_id) ORDER BY id DESC LIMIT 0, 9999999999;
+----+--------------------+-------+--------+-----------------------+------------+---------+--------------------+------+----------------------------------------------+
| id | select_type        | table | type   | possible_keys         | key        | key_len | ref                | rows | Extra                                        |
+----+--------------------+-------+--------+-----------------------+------------+---------+--------------------+------+----------------------------------------------+
|  1 | PRIMARY            | au    | index  | NULL                  | PRIMARY    | 4       | NULL               | 2272 | Using where                                  |
|  2 | DEPENDENT SUBQUERY | fa    | ref    | to_user_id,persona_id | to_user_id | 4       | const              |  396 | Using where; Using temporary; Using filesort |
|  2 | DEPENDENT SUBQUERY | pp    | eq_ref | PRIMARY               | PRIMARY    | 4       | kjdb.fa.persona_id |    1 | Using where                                  |
+----+--------------------+-------+--------+-----------------------+------------+---------+--------------------+------+----------------------------------------------+
3 rows in set (0.00 sec)

输出中的
列指示MySQL正在使用的索引

因此,是的,查询使用索引


您可以在运行的MySQL版本的MySQL文档中阅读更多关于
EXPLAIN
输出的信息。例如,如果您正在运行MySQL 5.1,请阅读。

我会很快。是,用于联接,但不用于筛选记录。请看一看额外的领域。当它使用where时,应该“使用索引”,而where的速度确实较慢

请考虑修改查询以避免子查询。@ /P>< P>由@ TROTT.< 虽然我认为你很有能力,也有能力提出并尝试其他的查询, 尽管如此,MySQL的一个奇怪的事实(很容易监督):MySQL长期以来一直声称,EXISTS可以比SELECT中的更好地优化,因为所查找的元素随后位于子查询中

这将是最简单的形式:

EXPLAIN
  SELECT au.*
  FROM users au
  WHERE EXISTS
    (SELECT fa.from_user_id FROM approvals fa
    INNER JOIN personas pp ON fa.persona_id = pp.id
    WHERE fa.from_user_id = au.id
      AND fa.to_user_id=1 AND pp.is_foundation=1
    GROUP BY fa.from_user_id)
  ORDER BY id DESC
  LIMIT 0, 9999999999;

如果使用索引,为什么运行此查询需要3秒钟?我认为
使用索引
意味着它使用索引作为覆盖索引
使用where
并不意味着它使用where子句的索引。