2012-07-15 20 views
1

我不確定這個查詢是否使用索引。 我如何看?這個查詢使用索引,在MySQL中?

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) 

回答

3

輸出中的key列指示MySQL正在使用的索引。

所以是的,查詢使用索引。

在您正在運行的MySQL版本的MySQL文檔中,您可以閱讀更多關於EXPLAIN的輸出信息。例如,如果您正在運行MySQL 5.1,請閱讀http://dev.mysql.com/doc/refman/5.1/en/explain-output.html

+0

爲什麼要過3秒鐘,運行此查詢,如果是使用索引? – TIMEX 2012-07-15 06:44:17

0

我會很快。是的,用於連接,但不用於過濾記錄。請看額外的領域。它應該是「使用索引」,而它的使用其中確實比較慢。

請考慮修改查詢以避免子查詢。

+0

我認爲'使用索引'意味着它使用索引作爲覆蓋索引。 '使用where'確實意味着它使用WHERE子句的索引。 – Ami 2012-07-15 08:43:20

0

由@Trott回答。儘管我認爲你很有能力並且能夠制定並嘗試替代查詢,但仍然存在一個奇怪的MySQL事實(易於監督):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;