Объясните результат запроса «объяснение» в MySQL

0

Я использую индексирование для таблиц mysql.

Мой запрос был таким:

 EXPLAIN SELECT * FROM `logs` WHERE userId =288 AND dateTime BETWEEN '2010-08-01' AND '2010-08-27' 

У меня есть индексирование в поле userId для этих журналов таблицы, и результат запроса объяснения ниже.

id  select_type     table     type  possible_keys   key     key_len     ref     rows    Extra
1      SIMPLE         logs     ref      userId      userId      4       const   49560   Using where

Вопрос: "Мое индексирование действительно полезно или нет?"...

Заранее спасибо

@fastmultiplication

Я думал, что индексирование в обоих этих областях может увеличить нагрузку на mysql, так как будет много записей с уникальными (userId и dateTime). Я попытался добавить индексирование на userId_dateTime, и результат

id  select_type     table   type    possible_keys            key        key_len     ref     rows    Extra
1      SIMPLE        logs    ref     userId_dateTime    userId_dateTime     4       const   63455   Using where
Теги:
performance

3 ответа

2
Лучший ответ

В вашем запросе используются индексы, и да, они полезны. Возможно, вам понадобятся следующие страницы документа:

Формат вывода EXPLAIN
Как MySQL использует индексы
Индексы нескольких столбцов

также:

Множественный индекс столбца против нескольких индексов

MySQL обычно использует индекс, который возвращает наименьшее количество строк. В первом примере MySQL использует индекс userId, чтобы сузить число строк до 49560. Это означает, что userId не содержит уникальных значений (если бы это было так, вам не понадобилось бы условие диапазона дат). Поскольку в столбце dateTime нет индекса, он должен сканировать каждую строку, чтобы найти те, которые соответствуют вашим критериям диапазона дат.

В вашем втором примере вы, кажется, создали составной (несколько столбцов) индекс на userId и dateTime. В этом случае кажется, что MySQL не может использовать последнюю половину индекса для предложения BETWEEN — я не уверен, почему. Возможно, стоит попробовать его с двумя отдельными индексами, а не с индексом с несколькими столбцами. Вы также можете попробовать заменить BETWEEN на:

'2010-08-01' >= AND <= '2010-08-27'

Это должно быть идентично, но см. следующий отчет об ошибке, который может повлиять на вашу версию MySQL:

Оптимизатор не использует индекс для BETWEEN в состоянии JOIN

1

Из поля "rows" похоже, что MySQL все еще оценивает, что ему придется искать много строк.

Вы также должны попробовать добавить индекс в поле dateTime.

И для этого конкретного запроса, возможно, индекс для обоих полей.

alter table logs add index user_datetime (userId,dateTime);
  • 0
    Я ввел более подробную информацию в вопросе, пожалуйста, проверьте
0

Сколько строк должно возвращать запрос? И как быстро выполняется запрос?

Мне кажется, что это довольно простой запрос, который использует правильный индекс, поэтому, если он по какой-то причине медленный, вероятно, потому, что он должен действительно возвращать много данных. Если вас действительно не интересуют все строки, вы можете использовать LIMIT, чтобы получить меньше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню