2

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

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第二次,尽管它在两种情况下都使用相同的索引?

4

2 回答 2

1

来自 MySQL 文档

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

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

有关这方面的更多信息,您可以参考

于 2013-02-08T07:57:28.003 回答
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';
于 2013-02-08T13:00:22.413 回答