#mysql
#mysql
Вопрос:
Я тестирую запросы для своего веб-сайта (разрабатываю), но я обнаружил, что есть что-то странное, чего я не могу понять, посмотрите на строку с красной звездочкой — почему этот запрос explain не содержит «using where»
Может ли кто-нибудь объяснить это? Большое вам спасибо
загрузка образца mysqldump (zip 46.9 MB): https://drive.google.com/open?id=0B3ve2F7eRJk4eUJteXppRVYzMk0
MariaDB 10.1.9 — Движок InnoDB
Комментарии:
1. На первый взгляд я бы сказал , что у log_timesamp есть индекс (который можно использовать в запросе), а у log_type его нет.
2. log_type не так важен, я добавил его, чтобы увидеть дополнительную информацию.
3. На самом деле мне интересно обратное: почему в вашем запросе от 2-го до последнего вообще есть «using where», хотя я думаю, что ваш последний план выполнения правильный. ICP не должен быть «using where» там. Какая у вас версия mysql?
4. Только что протестировал: ICP в 5.7 работает как ожидалось, 5.6 показывает ваше поведение при использовании
order by
и имеет пробел в вашем составном индексе. Вы можете включить отсутствующий index-column в свой запрос от 2-го до последнего, напримерand not log_action is null
(если это не исключает какую-либо строку — смысл в том, чтобы просто включить столбец в запрос, чтобы не пропустить столбец индекса), чтобы избавиться отusing where
too . Вероятно, это не квалифицируется как ошибка, это просто менее оптимальное поведение, но именно поэтому мы получаем новые версии mysql с улучшенными оптимизаторами.5. «using where» во 2-м запросе, потому что поле «log_type» отсутствует в индексе с несколькими столбцами, поэтому запрос использует только индекс log_user (1-й столбец в индексе с несколькими столбцами), а затем «using where» для фильтрации результата. Интересно, запрос Red Star тоже должен быть, но это не так, я в замешательстве. (Обновите мой вопрос, чтобы добавить пример файла и информацию о версии mysql)