насколько дорого это добавить уникальное ограничение на все столбцы mysql

0

В общем, я вижу два простых способа убедиться, что в таблице нет повторяющихся строк.

  1. Добавьте ограничение UNIQUE для всех столбцов таблицы (в моем случае 3)
  2. Создайте идентификатор первичного ключа, который является хешем других столбцов

Последнее будет больше для реализации. Предлагает ли он улучшения производительности, сравнивающие первичный ключ int, а не 3 столбца? Или mysql внутренне уже использует какой-то хэш на столбцах, когда он проверяет уникальность?

EDIT: типы столбцов: int (11), int (11) и datetime (6)

  • 1
    Создайте уникальный индекс по столбцам. Внутренне MySQL хранит индекс как B-дерево.
  • 0
    Какой будет сложность в результате? Будет ли он в том же порядке, что и идентификатор первичного ключа?
Показать ещё 3 комментария
Теги:

1 ответ

1

Количество байтов в индексе ограничено. Например, InnoDB ограничивает индекс до 767 байтов (как описано в документации). Таким образом, в зависимости от вашей строки вы не сможете определить уникальный индекс или первичный ключ для всех столбцов.

Реализация хэша имеет два недостатка:

  • У хэшей есть столкновения. Таким образом, вероятность может быть очень малой (в зависимости от хэш-алгоритма), но она существует.
  • Вам нужно добавить значение хэша, что обычно означает использование триггера.

Это все возможно - как триггеры вставки/обновления, чтобы гарантировать уникальность.

Я предполагаю, однако, что вам не нужно уникальное ограничение для всех столбцов. Некоторое подмножество, вероятно, разумно гарантировать уникальность. И если они уникальны, вся строка уникальна.

  • 0
    Я бы обрабатывал значение хеша через код без использования триггера, и, к сожалению, в этом случае мне нужны все три столбца (хотя только три), чтобы гарантировать уникальность. Вы все еще порекомендуете уникальное ограничение?
  • 0
    @curiousgeorge. , , Если вам нужно гарантировать уникальность трех столбцов, создайте уникальное ограничение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню