2011-05-21 20 views
1

我在我的數據庫中有一個invitations表,它有fromto列,它們都是我的users表中的userId列的外鍵。值得在列上添加索引只是爲了讓它們成爲外鍵?

例如,如果用戶#1邀請用戶#2做一些事情,然後在invitations表,from將是1,而to將2

我將使用to列中陳述,如:

SELECT * FROM invitations WHERE `to` = $currentUserId 

但是,from柱將永遠不會在WHERE語句中使用。

從我讀過的內容來看,你只應該在WHERE語句中使用的列上添加一個索引,但是我也讀過你應該總是創建外鍵。

爲了增加一個外鍵,在from上創建索引是否合理?

回答

2

對於外鍵,您應該添加一個,具體取決於您對用戶所做的操作。

在內部,您的fkeys將觸發任何插入/更新/刪除邀請的操作,但也會觸發任何更新/刪除用戶(id)的操作。

第一個將使用用戶(id)上的索引來檢查用戶是否存在。

另一個將基本上運行一個查詢:do whatever you defined to do on update/delete from invitations where to/from = :id

因此,如果您更改用戶的id(非常不可能),您可以使用索引。如果你偶爾刪除用戶(只有更可能),你可以使用索引。

而且正如在另一個答案中指出的那樣,索引對於通過/ limit子句排序的查詢也很有用。

+0

如果我將外鍵的更新操作設置爲'NO ACTION',那麼是否可以更快地對錶進行插入/更新? – 2011-05-21 16:17:24

+0

否。系統在刪除被引用的表(用戶)之後仍然必須驗證是否存在約束違規,並且仍然必須執行SELECT * FROM引用表(邀請),其中foreignkey = deletedFKvalue來實現該目的。您仍然需要索引來避免在引用表(用戶)更新/刪除時在引用表上發生全表掃描(邀請)。 – 2011-05-21 22:18:03

1

你應該只將在使用WHERE語句

並非如此添油加醋列添加一個索引。這是一個很好的經驗法則,但除此之外還有更多。

您還應該通過經常總是測試的順序對索引進行索引,並始終在更改前後進行測試,以查看是否有改進的性能。

外鍵一般不會受益於在其上定義索引,只要它們不是where/order by子句的一部分即可。如果他們是,你應該索引他們。 (再次,經驗法則)。

This看起來像是優化MySQL的一個很好的資源 - 關於索引解釋的底部。

+0

謝謝,但它不回答我的問題,添加索引只是爲了讓它們成爲外鍵是一個很好的理由嗎? – 2011-05-21 16:09:44

+0

@Click Upvote - 我不太明白如何添加索引使列成爲外鍵。 – Oded 2011-05-21 16:10:51

+0

列必須是索引才能成爲外鍵,是不是這樣? – 2011-05-21 16:15:24

相關問題