Как заставить использовать индекс в сортировке?

Входные данные: MySQL 5.7, таблица действий юзеров (InnoDB), больше миллиона записей, создано разбиение на разделы по HASH(user_id).
Есть запрос вида:
select * from `user_logs` where `user_id` = 189 AND `tt_in_line` = 1 order by `created_at` DESC limit 1;

Поле "created_at" типа datetime.
Также созданы индексы:
CREATE INDEX `full_ndx` (`user_id`, `tt_in_line`, `created_at`) USING BTREE;
CREATE INDEX `short_ndx` (`user_id`, `created_at`) USING BTREE;


Но почему-то запрос не использует индекс "full_ndx", а вместо него использует "short_ndx":
de77bcb54.png

Что я делаю не так при составлении индексов или я упустил какой-то механизм работы в данной версии MySQL?
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
ну так укажите ему явно через use index, если считаете, что умнее оптимизатора.

а так для каждого user_id то самое cardinality в tt_in_line низкое, поэтому движок считает, что дешевле почитать короткий индекс, чем длинный.

а еще проще все это денормализовать, сохраняя для каждого пользователя id (значение суррогатного ключи в таблице действий) последнего действия, чем каждый раз лазить искать его в индексе. причем, если мне не изменяет память, эта сборка не умеет направленность индексов.

лайвхак. на больших объемах забудьте про сорты, ордеры, лимиты, унионы, упаси бог. простые запросы по первичным ключам. иначе вам тупо не хватит озу сервера на буферы)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы