@ask0generator

MySQL. Использовать 2 одиночных индекса или 1 составной?

Создавая таблицу в WorkBench мне установилось 2 одиночных индекса на поля которые есть FOREIGN KEY:
INDEX `fk_var_locale_vars1_idx` (`var_id` ASC),
INDEX `fk_var_locale_locale1_idx` (`locale_id` ASC),

Но мне нужно дать ограничение на комбинацию ключей (`locale_id`, `var_id`),
Создав это вручную в WorkBench, мне дописалась строка в Forward Engineer:

UNIQUE INDEX `uk_group_locale_and_var` (`locale_id` ASC, `var_id` ASC),


Но предыдущие не удалились. Мне их удалять вручную или они пригодятся?
Я больше склоняюсь к ответу, что одиночные индексы не нужны (так как уже проиндексированными будут в составном ключе), но интересно услышать мнение других.
Ответы аргументируйте, пожалуйста! Спасибо

P.S. JOIN будет как на `var_id` так отдельно и на `locale_id`
  • Вопрос задан
  • 4539 просмотров
Решения вопроса 2
@ask0generator Автор вопроса
для чего нужны составные индексы:
для запросов WHERE `col1` = 5 AND `col3` < 2
вот для него нужен составной индекс col1+col5

в таких примерах чаще всего приводят аналогию с записной книжкой. представь у тебя в записной книжке сто тысяч адресатов. адресаты упорядочены в алфавитном порядке по возрастанию, по фамилии, затем - имени. (составной индекс, фамилия+имя)
и тебе нужно выбрать всех, у кого: фамилия начинается с буквы П или меньше, и имя <Л
Представил?
Вот всех с фамилией раньше П всё ясно - просто ищешь букву Р, листаешь на страницу ранее и всё что до этой страницы - искомые люди. А как теперь быть с именем? а никак, существующий индекс нам не поможет. Поэтому придётся перелистывать все фамилии и для каждой смотреть, какое имя ей сопоставлено.

Мне помогло разобратся!
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для существования FOREIGN KEY необходим индекс, начинающийся с соответствующего ссылочного поля и идущий в том же порядке. Так что `fk_var_locale_vars1_idx` Вы удалить не сможете. Кроме того, учитывайте, что составной индекс сортируется сначала по первому полю, при равных значениях первого поля - по второму и т.д. То есть отдельно по второму полю составной индекс не работает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
Индекс по `locale_id можно удалять, т.к. его дублирует новый индекс по `locale_id` & `var_id`.
Индекс по `var_id` удалять нельзя, т.к. в индексе `locale_id` & `var_id` значение val_id не является самым левым. Для поиска только по var_id, но без указания locale_id этот составной индекс не поможет и использоваться не будет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы