Должен ли я использовать уникальный индекс здесь?И почему? - PullRequest
0 голосов
/ 01 июня 2011

I read , но я все еще не понимаю, когда использовать нормальный индекс или уникальный индекс в MySQL.У меня есть таблица, в которой хранятся сообщения и ответы (id, parentId).Я установил три нормальных индекса для parentId, userId и editorId.

  1. Будет ли использование уникальных индексов полезным для меня, учитывая следующие типы запросов, которые я обычно выполняю?И почему?

Большинство моих запросов будут возвращать сообщение и его ответы:

SELECT * FROM posts WHERE id = @postId OR parentId = @postId ORDER BY postTypeId

Иногда я добавляю объединение для получения пользовательских данных:

SELECT * FROM posts
JOIN users AS owner ON owner.id = posts.userId
LEFT JOIN users AS editor ON editor.id = posts.editorId
WHERE id = @postId OR parentId = @postId ORDER BY postTypeId

В других случаях я могу попросить пользователя и его / ее сообщения:

SELECT * FROM users
LEFT JOIN posts ON users.id  = posts.userid
WHERE id = @userId

Моя схема выглядит следующим образом:

CREATE TABLE `posts` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `posttypeid` int(10) NOT NULL,
  `parentid` int(10) DEFAULT NULL,
  `body` text NOT NULL,
  `userid` int(10) NOT NULL,
  `editorid` int(10) NOT NULL,
  `updatedat` datetime DEFAULT NULL,
  `createdat` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
KEY `userId` (`userid`),
KEY `editorId` (`editorid`),
KEY `parentId` (`parentid`)
) ENGINE=InnoDB AUTO_INCREMENT=572 DEFAULT CHARSET=utf8

Ответы [ 3 ]

2 голосов
/ 01 июня 2011

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

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

Однако, если вы знаете, что могут быть дубликаты (что, как я полагаю, имеет место для ваших столбцов userId, editorId и parentId), использование атрибута UNIQUE было бы серьезной ошибкой: было бы запрещено несколько постов с одинаковым userId, editorId или parentId.

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

1 голос
/ 01 июня 2011

Уникальные ключи не имеют никакого преимущества по сравнению с обычными ключами для извлечения данных. Уникальные ключи - это индексы с ограничением: они предотвращают вставку одного и того же значения и поэтому приносят пользу только при вставках.

1 голос
/ 01 июня 2011

Уникальное ограничение, которое, как оказалось, реализуется индексом.

Используйте уникальные, когда вам нужны уникальные значения. Т.е. дубликатов нет. В противном случае нет. Это действительно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...