Эта оптимизация применяется если количество элементов в in больше чем in_subquery_conversion_threshold=10000. Для маленького количество элементов применяется index dives
https://dev.mysql.com/doc/refman/8.0/en/range-optimization.html (меньше eq_range_index_dive_limit=200), чтобы узнать сколько же строчек мы получим для каждого значения из IN. При этом потребляется 125 или 700 байт на каждое значение в in, но не более чем range_optimizer_max_mem_size байт на весь запрос. Таким образом, без использования "select * from (VALUES (1,2),(3,4)) t1 (c1,c2);" (этого синтаксиса нет в mysql) приходилось делать явную временную таблицу с которой джойнить оригинальный запрос без IN c тысячами значений. Почему становится быстрее: если index dives не сработали (из-за количества элементов или памяти), то приходится игнорировать условие с IN. Это может быть к лучшему, а может и приводить к сильному замедлению на табличках с миллионами-миллиардами строк.