我有一个具有以下结构的应用程序表
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
,虽然它在两种情况下都使用相同的索引?
答案 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';