У меня есть таблица с многостолбцовым UNIQUE
индексом _job_id__
и __keyword_id__
.
Нужно ли мне добавить еще один индекс, __job_id__
если у меня есть частый запрос, который выполняет для GROUP BY
этого столбца?
(при 100 миллионах строк это может занять некоторое время. Вот почему я спрашиваю, а не просто делаю)
Ответы:
Нет, совсем нет !!! MySQL Query Optimizer будет делать правильные вещи, если основной столбец (столбцы) будет самым левым в индексе. Если вы создали такой индекс, MySQL Query Optimizer может отказаться от использования этого индекса, если вы всегда выполняете GROUP BY job_id, keyword_id. MySQL Query Optimizer может или не может использовать индекс, если вы собираете записи только по job_id, но тогда у вас все равно будет избыточное пространство индекса.
Если в таблице указан MyISAM, создание такого индекса приведет к раздуванию файла MYI.
Если таблица InnoDB, а innodb_file_per_table равен 0, создание такого индекса приведет к раздуванию ibdata1.
Если в таблице указан InnoDB, а innodb_file_per_table равен 1, создание такого индекса приведет к раздуванию файла .ibd таблицы.
Таким образом, вам не нужно делать этот дополнительный индекс !!!
источник
Индексы могут только ускорить
group by
операции за счет сокращения сортировки - это будет более эффективно, если используемый индекс является кластеризованным индексом или, по крайней мере, имеет тот же ведущий столбец, что и кластеризованный индекс. Во всем этом я предполагаю, что MySQL не имеет эквивалентаhash group by
операции, которая обычно вообще обходила бы какие-либо преимущества индексов - может быть, кто-то другой может это подтвердить.Имеется незначительное преимущество, если иметь отдельный индекс,
job_id
если предположить, что это единственный столбец вgroup by
предложении, а также кластерный индекс: индекс будет меньше, и, следовательно, сканирование приведет к меньшему количеству операций ввода-вывода.--РЕДАКТИРОВАТЬ--
Поскольку индекс содержит все поля первичного ключа, определенные для ключа кластеризованного индекса, которых нет во вторичном индексе , индекс
job_id
будет только меньше, чем индекс,job_id, keyword_id
еслиkeyword_id
он не является частью кластерного индекса.источник