Ответ 1
Различия
-
KEY или INDEX относится к нормальному неистинному индексу. Допустимы нечеткие значения для индекса, поэтому индекс может содержать строки с одинаковыми значениями во всех столбцах индекса. Эти индексы не применяют никаких ограничений на ваши данные, поэтому они используются только для обеспечения быстрого выполнения определенных запросов.
-
UNIQUE относится к индексу, где все строки индекса должны быть уникальными. То есть одна и та же строка может не иметь одинаковых значений, отличных от NULL, для всех столбцов этого индекса в качестве другой строки. Как и для ускорения запросов, индексы UNIQUE могут использоваться для обеспечения ограничений на данные, поскольку система базы данных не допускает нарушения этого правила отдельных значений при вставке или обновлении данных.
Ваша система базы данных может позволить индексу UNIQUE применяться к столбцам, которые допускают значения NULL, и в этом случае двум строкам разрешено быть одинаковыми, если оба они содержат значение NULL (обоснование здесь состоит в том, что NULL считается не равным сам). Однако в зависимости от вашего приложения это может быть нежелательным: если вы хотите предотвратить это, вы должны запретить значения NULL в соответствующих столбцах.
-
PRIMARY действует точно так же, как индекс UNIQUE, за исключением того, что он всегда называется "PRIMARY", и может быть только один на таблице (и всегда должен быть один, хотя некоторые системы баз данных не применяют это). PRIMARY индекс предназначен в качестве основного средства для однозначной идентификации любой строки в таблице, поэтому в отличие от UNIQUE он не должен использоваться ни в каких столбцах, которые допускают значения NULL. Ваш индекс PRIMARY должен быть на наименьшем числе столбцов, достаточных для однозначной идентификации строки. Часто это всего лишь один столбец, содержащий уникальный автоинкрементный номер, но если есть что-то еще, что может однозначно идентифицировать строку, такую как "код страны" в списке стран, вы можете использовать это вместо этого.
Некоторые системы баз данных (такие как MySQL InnoDB) будут хранить записи таблицы на диске в том порядке, в котором они появляются в индексе PRIMARY.
Индексы -
FULLTEXT отличаются от всех вышеперечисленных, и их поведение существенно отличается между системами баз данных. Индексы FULLTEXT полезны только для полнотекстового поиска, выполненного с помощью предложения MATCH()/AGAINST(), в отличие от вышеприведенных трех, которые обычно реализуются внутренне с использованием b-деревьев (что позволяет выбирать, сортировать или диапазоны, начиная с левой колонки) или хеш-таблицы (с учетом выбора, начиная с левой колонки).
Если другие типы индексов являются универсальными, индекс FULLTEXT специализирован, поскольку он служит узкой цели: он используется только для функции "полнотекстового поиска".
Сходства
-
Все эти индексы могут содержать более одного столбца.
-
За исключением FULLTEXT, порядок столбцов является значительным: для того, чтобы индекс был полезен в запросе, запрос должен использовать столбцы из индекса, начинающегося слева - он не может использовать только второй, третьей или четвертой части индекса, если только он не использует предыдущие столбцы в индексе для соответствия статическим значениям. (Чтобы индекс FULLTEXT полезен для запроса, запрос должен использовать все столбцы индекса.)