1

このクエリがインデックスを使用しているかどうかはわかりません。どうすればわかりますか?

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)
4

3 に答える 3

3

出力のkey列は、MySQL が使用しているインデックスを示します。

はい、クエリはインデックスを使用します。

EXPLAIN実行しているバージョンの MySQL の MySQL ドキュメントで、出力に関する詳細を読むことができます。たとえば、MySQL 5.1 を実行している場合は、http://dev.mysql.com/doc/refman/5.1/en/explain-output.htmlを参照してください。

于 2012-07-15T06:14:39.770 に答える
0

急ぎます。はい、結合には使用できますが、レコードのフィルタリングには使用できません。エクストラフィールドをご覧ください。どこで実際に遅いかを使用している間は、「インデックスを使用」する必要があります。

サブクエリを避けるようにクエリを修正することを検討してください。

于 2012-07-15T06:29:02.110 に答える
0

@Trottによって回答されました。

あなたは非常に有能で、代替クエリを作成して試すことができると思いますが、それでも、MySQL の奇妙な事実の 1 つ (簡単に見られます): MySQL は長い間、求められている要素として、EXISTS は IN 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;
于 2012-07-15T06:32:11.820 に答える