2014-10-07 46 views
0

我在列上創建了唯一索引,然後使用ALTER TABLE添加了外鍵。 MySQL在列的唯一索引之上添加了一個非唯一索引。非唯一索引是否必需?它以任何方式加快速度?外鍵可以使用唯一索引嗎?

+0

爲什麼您在包含外鍵的列上創建唯一索引,而不是依賴推測的鏈表中存在的唯一約束? – 2014-10-07 18:27:12

+0

@GeorgeCummins確保「Something」只映射一次到「Something」? – dognose 2014-10-07 18:32:09

+0

將外鍵和索引添加到除主鍵以外的其他列中。上述異常行爲發生在引用表(子表)上。 – Waffles 2014-10-07 22:34:32

回答

1

Does it speed things up in any way?

首先,索引並不總是加快速度。索引正在減慢更新,插入和刪除語句,因爲索引必須隨數據一起更新。

其次,有些情況下,mysql-optimizer可能會決定使用錯誤的索引,而使用另一個索引可能會更快。

Is the non-unique index necessary?

號也看到您的用例MySQL文檔,如果你會做它的其他方式輪:

http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

MySQL的需要外鍵和參考指標密鑰,以便 外鍵檢查可以很快並且不需要表掃描。在 引用表中,必須有一個索引,其中外鍵 列作爲第一列以相同順序列出。如果它不存在 ,則會在引用表上自動創建這樣一個 索引。 如果您創建 另一個可用於強制實施外鍵約束的索引,則此索引可能稍後會自動丟棄。

+0

感謝您的回覆。我讀了那篇文章。索引在將唯一鍵添加到該表之前存在,因此MySQL應該有機會對索引進行評估。它添加了密鑰,因爲MySQL由於某種原因認爲它是必需的。我想知道爲什麼在唯一索引上需要非唯一索引。 – Waffles 2014-10-07 22:36:35

+0

@Waffles問題是,如果mysql真的評估現有的索引,或者它只是說:*我需要索引,我創建!! *(有時你不應該期望太多) – dognose 2014-10-07 23:03:06