Это связано с тем, что я называю правилом 5%, основанным на ключевой совокупности (количество элементов кортежа).
Если вы индексируете таблицу, в которой существует однобокое количество элементов, MySQL Query Optimizer всегда будет выбирать путь наименьшего сопротивления.
ПРИМЕР: Если в таблице есть столбец с полами, количество элементов равно двум, M и F.
Что вы указали в такой колонке по полу? Вы обязательно получите два гигантских связанных списка.
Если вы загрузите миллион строк в таблицу с гендерным столбцом, вы можете получить 50% M и 50% F.
Индекс становится бесполезным во время оптимизации запроса, если количество элементов ключевой комбинации (совокупность ключей, как я ее сформулировал) составляет более 5% от общего числа таблиц.
Теперь, что касается вашего примера, почему два разных плана EXPLAIN ??? Я думаю, что MySQL Query Optimizer и InnoDB как команда тегов.
В первом CREATE TABLE таблица и индексы имеют одинаковый размер, хотя и небольшой, поэтому он решил в пользу индекса, выполнив сканирование индекса, а не полное сканирование таблицы . Имейте в виду, что неуникальные индексы содержат внутренний первичный ключ каждой строки (RowID) в своих записях индекса, что делает индексы практически того же размера, что и сама таблица.
Во втором CREATE TABLE, из-за введения другого столбца, пользователь, , вы теперь заставляете Оптимизатор запросов видеть совершенно другой сценарий: таблица теперь больше индексов . Следовательно, Оптимизатор запросов стал более строгим в интерпретации того, как использовать доступные индексы. Это пошло к правилу 5%, которое я упомянул прежде. Это правило с треском провалилось, и Оптимизатор запросов принял решение в пользу полного сканирования таблицы.