Индекс и уникальность - это две совершенно разные концепции.
Индексы
Индекс - это скрытый дополнительный столбец, содержащий те же данные, отсортированные с указателем на ваши реальные данные.С помощью индекса вы можете
- Быстро найти определенный элемент
- Быстро найти диапазон элементов (между x и y)
- Сохранитьвремя при использовании
order by
, потому что элементы предварительно отсортированы - Экономьте время при использовании
group by
, так как группировка по должна соответствовать одинаковым элементам
Это нормальный индекс, он не 'Имейте в виду повторяющиеся значения, за исключением первичного ключа, который всегда уникален.
Уникальный (индекс)
Если вы хотите избежать дублирования значений, вы можете указать unique index
.Это выполнит все вышеперечисленное, но добавит дополнительную проверку при каждом обновлении и вставит , чтобы проверить, нет ли этих значений в базе данных.Если вы попытаетесь вставить дублирующую строку в уникальный столбец, MySQL выдаст ошибку и откажет в вставке.
(вы не можете создать строку unique
без использования индекса)
Использование индексов замедляет вставки и обновления.
Использование уникальных индексов замедляет, а затем еще больше замедляет.
Однако индексы ускоряются select
очень, очень много.
Unique
ничего не ускоряет, это гарантирует, что вы случайно не вставите дублирующую строку.
Когда использовать индексы, а когда нет
Не ставьте индекс для каждого поля.Как указано выше, это замедлит вас на insert
с и update
с.
Всегда ставьте индекс для критериев соединения.А если серьезно, рассмотрите возможность включения индекса в столбец, который вы используете в предложениях where
.
MySQL откажется использовать индекс, если 50% ваших строк имеют одинаковое значение в поле, поэтому забудьте об индексах в логическом (Да / Нет) поля, 99% времени они не будут работать.
(Индексы в полях с низким количеством элементов бесполезны)
Всегданазначьте первичный ключ
Всегда назначайте первичный ключ на вашей таблице.Предпочтительно типа integer autoincrement
.Если you не назначит первичный ключ, MySQL назначит для вас «скрытый» первичный ключ (типа целочисленного автоинкремента) , но вы не можете использовать скрытый PK для ускоренияцитируйте или идентифицируйте ваши строки, и есть множество других проблем с медлительностью со скрытыми PK, которые заставляют их очень плохо сосать.
Надеюсь, это поможет.
Ссылки:
Как MySQL использует индексы: http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html
Когда использовать индексы: http://www.howtoforge.com/when-to-use-indexes-in-mysql-databases
Подробнееиз этого материала: http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm
Наконец, скрывайтесь здесь, если вы хотите узнать больше о MySQL: http://planet.mysql.com/