Я использую индексирование для таблиц 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
В вашем запросе используются индексы, и да, они полезны. Возможно, вам понадобятся следующие страницы документа:
Формат вывода EXPLAIN
Как MySQL использует индексы
Индексы нескольких столбцов
также:
Множественный индекс столбца против нескольких индексов
MySQL обычно использует индекс, который возвращает наименьшее количество строк. В первом примере MySQL использует индекс userId
, чтобы сузить число строк до 49560. Это означает, что userId
не содержит уникальных значений (если бы это было так, вам не понадобилось бы условие диапазона дат). Поскольку в столбце dateTime
нет индекса, он должен сканировать каждую строку, чтобы найти те, которые соответствуют вашим критериям диапазона дат.
В вашем втором примере вы, кажется, создали составной (несколько столбцов) индекс на userId
и dateTime
. В этом случае кажется, что MySQL не может использовать последнюю половину индекса для предложения BETWEEN
— я не уверен, почему. Возможно, стоит попробовать его с двумя отдельными индексами, а не с индексом с несколькими столбцами. Вы также можете попробовать заменить BETWEEN
на:
'2010-08-01' >= AND <= '2010-08-27'
Это должно быть идентично, но см. следующий отчет об ошибке, который может повлиять на вашу версию MySQL:
Оптимизатор не использует индекс для BETWEEN в состоянии JOIN
Из поля "rows" похоже, что MySQL все еще оценивает, что ему придется искать много строк.
Вы также должны попробовать добавить индекс в поле dateTime.
И для этого конкретного запроса, возможно, индекс для обоих полей.
alter table logs add index user_datetime (userId,dateTime);
Сколько строк должно возвращать запрос? И как быстро выполняется запрос?
Мне кажется, что это довольно простой запрос, который использует правильный индекс, поэтому, если он по какой-то причине медленный, вероятно, потому, что он должен действительно возвращать много данных. Если вас действительно не интересуют все строки, вы можете использовать LIMIT
, чтобы получить меньше.