В mysql имеет такой же эффект в терминах скорости, используя ключ UNIQUE, чем ключ NORMAL? - PullRequest
0 голосов
/ 30 июля 2010

Например, я делаю следующее действие:

SELECT COUNT(id) 
  FROM users 
 WHERE unique_name = 'Wiliam'

// if Wiliam don't exists then...

INSERT INTO users 
   SET unique_name = 'Wiliam'

Вопрос в том, что я делаю проверку SELECT COUNT (id) каждый раз, когда вставляю нового пользователя, несмотря на использование уникального ключа или нет, поэтому ... если «unique_name» имеет уникальный ключ, это лучше по производительности, чем при использовании обычного ключа?

Ответы [ 3 ]

2 голосов
/ 30 июля 2010

То, что вы имеете в виду, является УНИКАЛЬНЫМ ОГРАНИЧЕНИЕМ в столбце, который будет обновлен Чтение будет быстрее, а вставки - чуть медленнее. Это все равно будет быстрее, чем сначала проверять код, а затем вставлять значение. Просто позвольте mysql сделать свое дело и вернуть вам ошибку, если значение не уникально.

1 голос
/ 31 июля 2010

Вы не сказали, для чего это, что поможет.Если это часть системы аутентификации, то почему в ваш запрос также не входит пароль пользователя?Если это не так, уникальный индексированный столбец, используемый для хранения имен, не будет работать очень хорошо в реальной системе, если вы не согласны с тем, что в вашей системе только один и только Вильям.(Это должен был быть Уильям?)

И если это поле имени действительно уникально, вам не нужно использовать COUNT (ID) в вашем запросе.Если «уникальное_имя» действительно уникально, либо вы получите идентификационный номер, возвращенный по вашему запросу, либо вы ничего не получите.

Вы бы хотели что-то вроде этого: ВЫБЕРИТЕ идентификатор от пользователей, ГДЕ уникальное имя = 'Wiliam'

Нет возврата записи, нет Wiliam.

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

Использование «уникального ключа» isn 'Это очень логично, поэтому я подозреваю, что вы запутались в номенклатуре ключей, индексов, их взаимосвязи и целях для них.

КЛЮЧИ в базе данных используются для создания и идентификации связей между наборами данных.Это то, что делает возможным использование «реляционных» в реляционной базе данных.

Ключи бывают двух видов: первичные и внешние.

ПЕРВИЧНЫЕ КЛЮЧИ идентифицируют каждую строку в таблице.Значение или значения, составляющие ключ, должны быть уникальными.

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

Я использую целочисленный тип данных MySql для моих первичных ключей.

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

INDEXES используются базой данных как своего рода сокращенный метод для быстрого поиска значений, в отличие от сканирования всей таблицы или столбца на предмет совпадения.Подумайте об индексе в конце книги.Гораздо проще найти что-то с помощью индекса книги, чем перелистывать страницы, ищущие это.

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

UNIQUE INDEX - это индекс, где все значения в нем должны быть различны.Столбец с уникальным индексом не позволит вам вставить повторяющееся значение, потому что это нарушит ограничение уникальности.Первичные ключи являются уникальными индексами.Но уникальные индексы не обязательно должны быть первичными ключами или даже ключом.

Надеюсь, это поможет.

[отредактировано для краткости]

0 голосов
/ 31 июля 2010

Наличие уникального ограничения - это хорошо, потому что оно предотвращает вставку дублированных записей в случае, если ваша программа содержит ошибки (у вас отсутствует условие «для обновления» в вашем операторе select?) Или если кто-то вставляет данные, не используя ваше приложение.

Однако вы не должны зависеть от этого в вашем приложении для нормальной работы.Предположим, уникальное имя - это поле ввода, которое может указать пользователь.Ваша заявка должна проверить, является ли имя уникальным.Если это так, вставьте его.Если это не так, сообщите об этом пользователю.

Это плохая идея - просто попробовать выполнить вставку во всех случаях и посмотреть, была ли она успешной: это приведет к ошибкам в журналах сервера базы данных, что затруднитнайти реальные ошибки.И это сделает вашу текущую транзакцию бесполезной, что может быть проблемой в зависимости от ситуации

...