Вы используете InnoDB, правильно? Вторичные ключи InnoDB (такие как INDEX(phone)
) неявно включают столбцы PRIMARY KEY
. Таким образом, индекс фактически равен BTree (phone, fc_date)
.
.
Далее, отметим, что необходим еще один столбец из c2
: fc_status
. Итак, Оптимизатор посмотрел на два способа выполнения запроса. Во-первых, обратите внимание, что любой подход имеет оптимальные столбцы в индексе, и они находятся в оптимальном порядке.
План A: используйте индекс, затем отскок назад и вперед между индексом и данными.
План Б: Сканирование таблицы, для которого не потребуется перемотка вперед и назад.
Оптимизатор правильно выбрал B.
У вас может быть лучший индекс, и оптимизатор, скорее всего, его выберет. И это будет быстрее:
INDEX(phone, fc_date, fc_status) -- in this order
Это «покрытие», в котором присутствуют все необходимые столбцы. Следовательно, туда и обратно не будет.
Мне нужно критиковать VARCHAR(100)
. Это потенциально очень плохо для дат, поскольку в зависимости от формата они могут сортироваться неправильно.
Имена, вероятно, никогда не бывают 100 символов; письма могут быть длиннее. И т.д. 4 телефонных номера? Что случилось?