Для
SELECT MIN(key_part2),MAX(key_part2)
FROM tbl_name WHERE key_part1=10;
вам нужно
INDEX(key_part1, key_part2)
Что у вас есть
SELECT MIN(key_part2) -- id
FROM tbl_name WHERE key_part1=10; -- ctime
, который нуждается
INDEX(ctime, id)
Однако вторичные индексы InnoDB автоматически включают в себя PK, так что просто
INDEX(ctime)
случается, имеет тот же эффект. (Я предпочитаю сказать INDEX(ctime, id)
в качестве подсказки читателю, что мне нужна эта пара.)
«Поскольку индексирование ctime не столь значимо для таблицы» - ну, это было значимо для этого одного запроса! Итак, индексируйте его.
Без индекса вся таблица будет считана для обработки запроса.
С индексом будет считана только одна строка в INDEX
для получения результата.
Это настолько экстремально, насколько это возможно (если не иметь индекса).
Между тем,
select min(id) from user
использует PRIMARY KEY
и читает только одну строку, чтобы получить ответ.
"Я думаю, есть ли другой способ сделать запрос менее чем за 1 секунду без индексации столбца ctime?" Почему это имеет значение? Просто добавьте индекс и покончите с проблемой.