должны ли почти уникальные поля иметь индексы - PullRequest
2 голосов
/ 12 ноября 2008

У меня есть поле в базе данных, которое почти уникально: в 98% случаев значения будут уникальными, но оно может иметь несколько дубликатов. Я не буду много искать в этой области; скажем дважды в месяц. Таблица в настоящее время имеет ~ 5000 записей и будет получать около 150 в месяц.

Должно ли это поле иметь индекс?

Я использую MySQL.

Ответы [ 8 ]

5 голосов
/ 12 ноября 2008

Я думаю, что «почти уникальным», вероятно, является красная сельдь. Данные либо уникальны, либо нет, но это не определяет, хотите ли вы индексировать их по соображениям производительности.

Ответ:

5000 записей - это на самом деле совсем немного, и независимо от того, есть ли у вас индекс, поиск все равно будет быстрым. При таком количестве вставок вам понадобится 3 года, чтобы получить 10000 записей, что также не так много.
Лично я не стал бы беспокоиться о добавлении индекса, но это не имело бы значения, если бы вы это сделали.

Пояснение:

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

Без индекса выполнение select в этом поле означает, что MySQL должен пройтись по каждой строке и прочитать каждое поле. Добавление индекса предотвращает это.

Недостатком индекса является то, что при каждой вставке данных БД должна обновлять индекс в дополнение к добавлению данных. Обычно это небольшие накладные расходы, но вы бы действительно заметили это, если бы у вас было много индексов, и вы много писали.

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

1 голос
/ 12 ноября 2008

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

1 голос
/ 12 ноября 2008

Это совсем не много записей; Я бы не стал создавать индексы для этой таблицы. Относительная уникальность поля не имеет значения - даже на многолетнем товарном оборудовании я ожидаю, что запрос по этой таблице займет доли секунды.

0 голосов
/ 13 ноября 2008

Это зависит. Как ответили другие, существует компромисс между скоростью обновления таблицы и скоростью выбора. Обновление таблицы включает в себя вставки, обновления и удаления в таблице.

Один вопрос, на который вы не ответили. Есть ли у таблицы первичный ключ и соответствующий индекс? Таблица без индексов обычно имеет форму, имеющую хотя бы один индекс. Наиболее распространенный способ получения этого индекса - это объявление первичного ключа и использование СУБД для создания индекса соответствующим образом.

Если в таблице нет кандидатов на первичный ключ, это обычно указывает на серьезный недостаток в оформлении таблицы. Это отдельная проблема, и ее следует обсудить отдельно.

0 голосов
/ 12 ноября 2008

Нет. Есть не так много записей, и это не будет часто запрашиваться. Нет необходимости индексировать.

0 голосов
/ 12 ноября 2008

Это действительно суждение. С такой маленькой таблицей вы можете искать достаточно быстро без индекса, чтобы вы могли обойтись без него.

С другой стороны, стоимость создания индекса, который вам на самом деле не нужен, довольно низкая, поэтому вы не сильно экономите, не делая этого.

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

РЕДАКТИРОВАТЬ: Что касается изменения требований, необходимо учитывать следующее: если база данных растет, и вы узнаете позже, что вам нужен индекс, можете ли вы просто создать индекс и все готово? Или вам также потребуется изменить много кода, чтобы использовать новый индекс?

0 голосов
/ 12 ноября 2008

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

0 голосов
/ 12 ноября 2008

Из того, что вы говорите, не похоже, что указатель необходим. Основное правило - индексные поля, которые используются в SELECTS для ускорения поиска, что в свою очередь (может) замедляет вставки и обновления.

На таком маленьком альбоме, как ваш, я не думаю, что вы увидите большую часть реального мира в любом случае.

...