2011-06-01 162 views
0

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 

回答

2

當索引創建爲UNIQUE時,它只會爲您的表添加一致性:插入一個新的條目按錯誤重複使用相同的鍵將失敗,而不會被接受,並在以後導致奇怪的錯誤。

所以,你應該使用它爲您的ID,當你知道不會有重複的(它的默認和強制主鍵),但它不會給你任何好處表現明智的。它只給你一個保證,你不必處理由於客戶端代碼中的錯誤而導致的特定類型的數據庫損壞。但是,如果你知道可能有重複項(我認爲你的列userId,editorId和parentId是這種情況),那麼使用UNIQUE屬性將是一個嚴重的錯誤:它將禁止具有相同userId的多個帖子,editorId或parentId。

簡而言之:在任何地方都可以使用它,但在這種情況下,您無法使用它。

+0

謝謝你的解釋。我認爲這是有道理的。爲什麼在我的場景中使用它呢?用戶可以對帖子有很多回復,所以userId,parentId會被複制,但是post.id不會。爲什麼使用它會有什麼意義? post.id不會總是唯一的嗎? – Mohamad 2011-06-01 18:09:57

+1

我澄清了這兩種情況。 – Jerome 2011-06-01 18:49:15

1

唯一是一個恰好由索引實現的約束。

當您需要唯一值時使用唯一。 IE沒有重複。否則不要。真的很簡單。

1

唯一鍵與數據檢索的普通鍵沒有任何優勢。唯一鍵是具有約束的索引:它們阻止插入相同的值,因此它們只對插入有好處。

相關問題