我应该在这里使用唯一索引吗?为什么?

时间:2011-06-01 17:33:17

标签: mysql indexing

read但我仍然很困惑何时在MySQL中使用普通索引或唯一索引。我有一个存储帖子和响应的表(id,parentId)。我为parentId,userId和editorId设置了三个正常索引。

  1. 鉴于我通常会运行以下类型的查询,使用唯一索引会以任何方式使我受益吗?为什么?
  2. 我的大多数查询都会返回一个帖子及其回复:

    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 个答案:

答案 0 :(得分:2)

当索引创建为UNIQUE时,它只会增加表的一致性:插入一个按错误重用相同键的新条目将失败,而不是被接受并在以后导致奇怪的错误。

所以,当你知道不会有重复时,你应该使用它作为你的ID(默认情况下这是主要的密钥),但它不会给你带来任何好处。 。它只能保证您不必因客户端代码中的错误而处理特定类型的数据库损坏。

但是,如果您知道可能存在重复项(我假设您的列为userId,editorId和parentId),则使用UNIQUE属性将是一个严重错误:它将禁止具有相同userId的多个帖子, editorId或parentId。

简而言之:尽可能地使用它,但在这种情况下你不能。

答案 1 :(得分:1)

Unique是一个恰好由索引实现的约束。

当您需要唯一值时使用unique。 IE没有重复。否则不要。那很简单。

答案 2 :(得分:1)

与普通的数据检索键相比,唯一键没有任何优势。唯一键是具有约束的索引:它们阻止插入相同的值,因此它们只对插入有益。