PostgreSQL: уникальное ограничение или уникальный индекс - PullRequest
0 голосов
/ 23 июня 2018

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

Например, у меня есть таблица users со столбцом login, которая должна быть уникальной.Мне нужен быстрый поиск пользователя по столбцу login.

Какой лучший способ сделать это:

  1. создать уникальное ограничение (оно создает внутренний уникальный индекс - используется ли онов запросах на выборку с WHERE login = 'something'?)
  2. создать уникальный индекс
  3. создать уникальный индекс и уникальное ограничение (индекс дублирует внутренний индекс?)

Второй случайуникален login для незарегистрированных пользователей (столбец locked = false).Postgres не поддерживает частичные условия.Должен ли я создать уникальный условный и частичный индекс или достаточно только частичного индекса?

И еще один вопрос: я должен создать новый индекс для столбца с внешним ключом?Например: users.employee_id относится к employees.id. Должен ли я создать индекс для столбца employee для оптимизированного запроса SELECT * FROM users WHERE employee_id = ....?Когда внутренние индексы используются механизмом оптимизации, а когда нет?

1 Ответ

0 голосов
/ 24 июня 2018

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

Если это так, вам нужно уникальное ограничение. Уникальные ограничения навязываются (за кулисами) уникальными индексами.

Концептуально:

  • Уникальное ограничение определяет уникальность.
  • Уникальный индекс реализует уникальное ограничение.
  • Уникальный индекс обеспечивает быстрый поиск, поскольку он позволяет выполнять такие операции, как сканирование диапазона индекса и поиск индекса.

Используется ли он в запросах выбора с WHERE login = 'нечто'?

Да, это так.

Второй случай - уникальный вход в систему для незаблокированных пользователей (столбец заблокирован = false).

В этом случае ограничение unique не будет работать. Может быть, здесь поможет триггер на вставке.

я должен создать новый индекс для столбца с внешним ключом?

Нет, он не нужен (по крайней мере, в текущей версии 10 и, возможно, в более поздних версиях), с. Документация

PostgreSQL автоматически создает уникальный индекс, когда для таблицы определено уникальное ограничение или первичный ключ. [...] Нет необходимости вручную создавать индексы для уникальных столбцов; это просто дублирует автоматически созданный индекс.

...