Кроме
SQL_CALC_FOUND_ROWS
добавлен
user_id
. Это поле отсутствует в индексе и бд нужно сходить на диск, в отличии от первого запроса, где
id
берется из покрывающего индекса. Поэтому во втором запросе анализатор решает, что лучше не использовать индекс.
Самый оптимальный вариант сделать составной покрывающий индекс
ALTER TABLE `aab` ADD KEY `created_at_user_id` (`created_at`, `user_id`);
Второй вариант использовать FORCE INDEX. Это медленнее покрывающего индекса, так как все равно бд придется сходить на диск, но зато уже не будет сортировки без индекса
EXPLAIN SELECT SQL_CALC_FOUND_ROWS id, user_id
FROM aab FORCE INDEX (created_at)
ORDER BY created_at DESC LIMIT 0, 20;