我的数据库中有一个invitations
表,其中包含from
和to
列,这两列都是我userId
列的外键users
1}}表。
例如,如果用户#1邀请用户#2做某事,那么在invitations
表格中,from
将为1,而to
将为2。
我将在where语句中使用to
列,例如:
SELECT * FROM invitations WHERE `to` = $currentUserId
但是from
列永远不会在WHERE语句中使用。
根据我的阅读,你应该只在WHERE语句中使用的列上添加一个索引,但是我也读过你应该总是创建外键。
在from
创建索引只是为了添加外键对我有意义吗?
答案 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的一个很好的资源 - 在它解释索引的底部看。