2014-01-09 28 views
2

我得到了調整一個非常古老的MySQL數據庫以在另一個程序中使用其數據的任務,並且我發現了一些具有這種結構的非常大的表(成千上萬行):在MySQL中重複唯一索引的原因

CREATE TABLE `foo` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `Name` varchar(200) NOT NULL, 
    PRIMARY KEY (`Id`), 
    UNIQUE KEY `foo_Name_Idx` (`Name`), 
    UNIQUE KEY `Name` (`Name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

這些顯然重複的唯一索引是什麼原因?演出內容嗎?自動創建表錯誤?

+1

也許數據庫設計者,是不是在數據庫設計那麼好,或者該列名與另一個表具有FK關係,作爲結尾'_Idx',通常在創建FK時由mysql生成。無論如何,這沒有合理的解釋,但可能是一個簡單的錯誤。 –

回答

2

像這樣的冗餘索引沒有任何好處。如果你爲它們指定了不同的名字,MySQL允許你創建它們,但是應該避免它們。

如果你想找到的所有數據庫中的冗餘索引我建議你使用這些工具之一:

pt-duplicate-key-checker 

一旦安裝,你可以查詢它是這樣的:

SELECT * FROM common_schema.redundant_keys\G 
+0

我安裝了common_schema(順便說一下非常好!),並且冗餘的keys命令返回了所有包含我提到的問題的表格。這意味着我可以節省很多空間,因爲桌子很大,放下重複的鍵,對吧? – javsmo

+0

是的,刪除冗餘索引將節省大量的磁盤空間。我們知道,在刪除索引時表將被鎖定,並且在大型表上需要一些時間,所以在數據庫正在被使用時不要這樣做。 –

+0

另外,爲了安全起見,您可能需要檢查代碼庫,以確保沒有索引提示引用您計劃按名稱刪除的任何索引。 –