Оператор EXPLAIN говорит: "Использование где; Использование индекса "если USE INDEX() установлен в запросе, в противном случае просто говорит" Использование где "

У меня есть таблица приложений со следующей структурой

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 ответа

Я отвечу на вопрос из комментариев: как переписать запрос, чтобы он работал не только для 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';

Из документации MySQL:

Информация столбца извлекается из таблицы с использованием только информации в дереве индекса без необходимости дополнительного поиска для чтения фактической строки. Эту стратегию можно использовать, когда в запросе используются только столбцы, которые являются частью одного индекса.

Если в столбце "Дополнительно" также указано "Использование где", это означает, что индекс используется для поиска значений ключей. Без использования where оптимизатор может считывать индекс, чтобы избежать чтения строк данных, но не использовать его для поиска. Например, если индекс является индексом покрытия для запроса, оптимизатор может сканировать его, не используя его для поиска.

Для получения дополнительной информации об этом, вы можете сослаться на это.

Другие вопросы по тегам