Нужно ли добавлять новый индекс с одним столбцом в таблицу, если индекс с несколькими столбцами в этом поле уже существует?

10

У меня есть таблица с многостолбцовым UNIQUEиндексом _job_id__и __keyword_id__.

Нужно ли мне добавить еще один индекс, __job_id__если у меня есть частый запрос, который выполняет для GROUP BYэтого столбца?

(при 100 миллионах строк это может занять некоторое время. Вот почему я спрашиваю, а не просто делаю)

JIStone
источник
Если ваш реальный вопрос о медленном запросе, то, пожалуйста, предоставьте SHOW CREATE TABLE SHOW TABLE STATUS SHOW LARE LIKE '% buffer%' ОБЪЯСНИТЕ ВЫБРАТЬ ... Сколько оперативной памяти доступно? Есть много возможных причин; большинство из них можно увидеть, посмотрев на эти предметы.
Рик Джеймс

Ответы:

5

Нет, совсем нет !!! 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 таблицы.

Таким образом, вам не нужно делать этот дополнительный индекс !!!

RolandoMySQLDBA
источник
Вы уверены? Этот парень предлагает иначе: stackoverflow.com/questions/179085/… или это отличается от MySQL для MSSQL?
Тадей
4

Индексы могут только ускорить group byоперации за счет сокращения сортировки - это будет более эффективно, если используемый индекс является кластеризованным индексом или, по крайней мере, имеет тот же ведущий столбец, что и кластеризованный индекс. Во всем этом я предполагаю, что MySQL не имеет эквивалента hash group byоперации, которая обычно вообще обходила бы какие-либо преимущества индексов - может быть, кто-то другой может это подтвердить.

Имеется незначительное преимущество, если иметь отдельный индекс, job_idесли предположить, что это единственный столбец в group byпредложении, а также кластерный индекс: индекс будет меньше, и, следовательно, сканирование приведет к меньшему количеству операций ввода-вывода.

--РЕДАКТИРОВАТЬ--

Поскольку индекс содержит все поля первичного ключа, определенные для ключа кластеризованного индекса, которых нет во вторичном индексе , индекс job_idбудет только меньше, чем индекс, job_id, keyword_idесли keyword_idон не является частью кластерного индекса.

Джек говорит, попробуйте topanswers.xyz
источник