https://dev.mysql.com/doc/refman/5.5/en/create-tab...MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. This index might be silently dropped later, if you create another index that can be used to enforce the foreign key constraint. index_name, if given, is used as described previously.
При использовании внешних ключей индекс на поле используется для связи обязателен, это нужно чтобы скорость работы не была грустной.
причем как система определяет кто именно будет индексом - непонятно, и вешает на этот индекс созданные связи
какой индекс использовать решает внутренний оптимизатор mysql.
Чтобы увидеть какой индекс использует определенный запрос есть explain:
https://habr.com/ru/post/211022/
Создавать индекс на все поля сразу не нужно, это наоборот замедлит работу, если нет запросов которые бы использовали все поля из этого индекса.
Поэтому индексы надо создавать точечно для каждого набора полей в запросах для максимальной скорости работы. Т.е. если данных реально много и работает медленно, то надо создавать индексы под каждый запрос отдельно.
Индекс используется для всех полей которые используется в запросе во where, order, group, агрегатных функциях(вроде как)
можете в 2х словах на пальцах объяснить роль этого индекса, и кого нужно на эту роль назначать?
Здесь что-то на эльфийском.
Какие роли и что вы собрались назначать.
Как написал выше mysql сам решает какой индекс оптимальнее и использует какой-то один для запроса наиболее подходящий.
select * from table where field1 = 123 and field2 = 321 order by field3
индекс на field1 + field2 + field3 будет оптимальным в большинстве случаев для этого запроса. Даже если там у вас еще 10 полей в таблице.