Как вы определяете индексы на этапе проектирования БД?
У таблицы есть столбцы:
id, uid, interval, data, oldstatus, newstatus, email
В процессе работы выясняется что нужен индексы на id, uid, email составной на interval+data
Далее есть условие: WHERE oldstatus != newstatus AND email=1
Я не очень понимаю составной индекс на какие поля нужен при таком запросе?
Уже минимум 5 индексов выходит, и я не могу пока знать какой из них насколько часто будет использоваться. Как в этих условиях не пропустить какой-то нужный индекс но и не слишком сильно замедлить время INSERT при росте БД?
Или имеет смысл пока не делать составные индексы, а обойтись простым по каждой колонке?
Индексы в основном ставятся на те колонки по которым идет выборка where.
Если ваше условие: WHERE oldstatus != newstatus AND email=1
то на них и ставьте.
По поводу id, если он у вас primаry – то это и есть индекс, дополнительно навешивать ничего не надо
Двойные, тройные индексы я бы ставил только если данных очень много и выборка идет только по ним. А для универсальных случаев лучше делать отдельные индексы, по скорости будет незаметно.
Составные индексы вешаются в порядке - уменьшаем выборку - выбираем из оставшегося.
Т.е. если у вас всего два статуса и 1000 email то индекс должен быть (email, status). Дальше по аналогии.
Как выбрать что-то - смотрится по функционалу, и/или по статистике.(Ставьте лог на запросы).
Так же собрать все запросы какие есть. Посмотреть пересечения и т.д.
грубо говоря индекс составляется последовательно:
сперва индекс по полю которое максимально уменьшит первую часть выборки, потом второе поле по которому будет что-то находится из того что осталось.
Ну вот у вас статус положим.
oldStatus 0 - новый 1 - отправленный - итого статуса всего два (новый и отправленный).
По сути email у нас не уникальный а значит предположим что записей с одним email может быть 100, а всего записей 10000.
Теперь используя знания по формировании индексов в MySQL мы понимаем что сперва нам нужно найти все записи с указанным email и уже в них искать подходящие статусы.