Индексирование по внешним ключам - PullRequest
0 голосов
/ 30 сентября 2019

Использование MySQL. У меня есть 2 основных стола детей и групп. Оба прямо вперед. Дети: идентификатор, имя, фамилия. Группы: идентификатор, имя. Ребенок может быть в 0 для многих групп. И группа может содержать от 0 до многих детей. Это обрабатывается в третьей таблице: дочерние группы. Я добавил внешние ключи к дочерним элементам и группам.

CREATE TABLE childgroups 
(
    childId INT,
    groupId INT
);

ALTER TABLE childgroups 
    ADD FOREIGN KEY (fk_child) REFERENCES children(id);
ALTER TABLE childgroups 
    ADD FOREIGN KEY (fk_group) REFERENCES groups(id);

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

Я буду использоватьНапример, в этой таблице:

SELECT childId 
FROM childgroups 
WHERE groupId = 123;

SELECT groupId 
FROM childgroups 
WHERE childId = 1366;

SELECT children.firstname, children.lastname 
FROM children, childgroups, groups 
WHERE groups.name = "Lions";

Достаточно ли просто определить индекс для childId и / или groupId?

Или я также могу указать комбинированный индекс, например:

CREATE INDEX childgroups_index ON childgroups (childid);
CREATE INDEX childgroups_index ON childgroups (groupid);
CREATE INDEX childgroups_index ON childgroups (childid, grouppid);

1 Ответ

1 голос
/ 30 сентября 2019

Ваше предположение, что внешние ключи не индексируются автоматически, неверно, см. Использование ограничений FOREIGN KEY :

MySQL требует индексов для внешних ключей и ссылочных ключей, чтобы проверки внешних ключейможет быть быстрым и не требовать сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке. Такой индекс создается для ссылочной таблицы автоматически, если он не существует. Этот индекс может быть автоматически отброшен позже, если вы создадите другой индекс, который можно использовать для применения ограничения внешнего ключа. index_name, если дано, используется, как описано ранее.

Однако в вашей таблице отсутствует уникальный ключ на (childId, groupId), в противном случае вам будет разрешено добавлять одну и ту же комбинацию несколько раз. Таким образом, было бы неплохо сделать эти два столбца (составным) первичным ключом (который является общим для таблиц ассоциации):

CREATE TABLE childgroups 
(
    childId INT,
    groupId INT,
    primary key (childId, groupId)
);

В дополнение к неявному индексу, созданному внешним ключом в groupId (внешний ключ в childId может использовать первичный ключ), все требования индекса, которые вы можете придумать, выполнены, и вам не нужно добавлять какой-либо другой индекс в эту таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...