EXPLAIN声明说'使用在哪里;使用索引'如果在查询中设置了USE INDEX(),则只需说'使用where'

时间:2013-02-08 07:22:26

标签: mysql indexing explain

我有一个具有以下结构的应用程序表

app_id VARCHAR(32) NOT NULL, 
dormant VARCHAR(6) NOT NULL, 
user_id INT(10) NOT NULL UNSIGNED

我在这张桌子上有两个索引 - :

combo1(UNIQUE) - app_id, user_id; 
combo2(INDEX) - app_id, dormant, user_id

我运行此查询

EXPLAIN SELECT COUNT(user_id), 
      IF(user_id=1,'yes','no') FROM apps 
      WHERE app_id='app_2' AND dormant = 'false'

它输出以下信息 - :

id -> 1; 
type -> SIMPLE; 
table -> apps; 
possible_keys -> combo1, combo2; 
key -> combo2; 
key_len -> 34; 
ref -> const; 
rows -> 1; 
Extra -> Using where

但是当我运行此查询时

EXPLAIN SELECT COUNT(user_id), 
    IF(user_id=1,'yes','no') 
FROM apps USE INDEX(combo2) 
WHERE app_id='app_2' AND dormant = 'false'

它输出以下信息 - :

id -> 1; 
type -> SIMPLE; 
table -> apps; 
possible_keys -> combo2; 
key -> combo2; 
key_len -> 42; 
ref -> const,const; 
rows -> 1; 
Extra -> Using where; Using index

为什么它第二次说Using index,虽然它在两种情况下都使用相同的索引?

2 个答案:

答案 0 :(得分:1)

来自MySQL文档

仅使用索引树中的信息从表中检索列信息,而无需执行额外的搜索来读取实际行。当查询仅使用属于单个索引的列时,可以使用此策略。

如果Extra列也显示Using where,则表示索引用于执行键值的查找。如果不使用where,优化器可能正在读取索引以避免读取数据行但不使用它进行查找。例如,如果索引是查询的覆盖索引,则优化程序可以扫描它而不使用它进行查找。

有关此问题的详情,请参阅this

答案 1 :(得分:1)

我将从评论中回答这个问题:如何重写查询,使其不仅适用于user_id=1

SELECT
   COUNT(user_id) as distinct_user_count,
   IF(SUM(user_id=@user_id), 'yes', 'no') as is_the_user_found
FROM apps 
WHERE app_id='app_2' AND dormant = 'false';