值得在列上添加索引只是为了使它们成为外键?

时间:2011-05-21 16:03:24

标签: mysql database database-design database-optimization

我的数据库中有一个invitations表,其中包含fromto列,这两列都是我userId列的外键users 1}}表。

例如,如果用户#1邀请用户#2做某事,那么在invitations表格中,from将为1,而to将为2。

我将在where语句中使用to列,例如:

SELECT * FROM invitations WHERE `to` = $currentUserId

但是from列永远不会在WHERE语句中使用。

根据我的阅读,你应该只在WHERE语句中使用的列上添加一个索引,但是我也读过你应该总是创建外键。

from创建索引只是为了添加外键对我有意义吗?

2 个答案:

答案 0 :(得分:2)

如果是外键,则应根据您对用户的操作添加一个。

在内部,您的fkeys将对任何插入/更新/删除邀请以及任何用户更新/删除(id)时触发操作。

其中第一个将使用用户(id)上的索引来检查用户是否存在。

另一个基本上会运行一个查询:do whatever you defined to do on update/delete from invitations where to/from = :id

因此,如果您更改用户的ID(非常不可能),您可以使用索引。如果您偶尔删除用户(只是稍微有可能),您可以使用索引。

正如在另一个答案中指出的那样,索引对于带有/ limit子句的查询也很有用。

答案 1 :(得分:1)

  

您应该只在将在WHERE语句

中使用的列添加索引

它不是那么切割和干燥。这是一个很好的经验法则,但除此之外还有更多的东西。

您还应经常索引经常订购的列,并始终在更改前后进行测试,以确定您是否提高了性能。

外键一般不会从定义索引中受益,只要它们不是where / order by子句的一部分。如果是,你应该索引它们。 (再次,经验法则)。

This看起来是优化MySQL的一个很好的资源 - 在它解释索引的底部看。