在EF CodeFirst中,建模外键关系的一般原因是为了实体之间的可导航性。考虑一个
Country和的简单情况,
City为以下LINQ语句定义了急切的加载:
var someQuery = db.Countries .Include(co => co.City) .Where(co => co.Name == "Japan") .Select(...);
这将导致以下查询:
SELECT *FROM Country coINNER JOIN City ci ON ci.CountryId = co.IDWHERe co.Name = 'Japan';
如果没有在外键上启用索引
City.CountryId,则SQL将需要扫描“城市”表,以便在JOIN期间为“国家/地区”过滤城市。
TL; DR
建议使用外键索引,即使您不直接在外键上进行过滤,联接中仍将需要它。似乎有一些例外:
如果外键的选择性非常低,例如在上述情况下,如果国家表中所有城市的50%在日本,则该索引将无用。
如果您实际上从未浏览过该关系。
另外一个优化考虑因素是是否
ClusteredIndex在子表的“表”中使用外键(即按国家对城市进行集群)。这在parent:child表关系中通常是有利的,在该关系中,通常可以同时检索父级的所有子行。



