如何正确索引我的数据库以提高查询性能

时间:2011-02-20 21:14:55

标签: sql database database-design indexing foreign-keys

我正在使用OpenID处理简单的登录页面:如果用户刚刚注册了OpenID,那么我需要在数据库中为用户创建一个新条目,否则我只是用问候语显示他们的别名。每当有人使用他们的Open ID进行身份验证时,我必须通过查找哪个用户具有给定的OpenID来找到他们的别名,并且如果主键是UserID(并且有数百万用户),它似乎可能相当慢。 / p>

我正在使用SQL Server 2008,我的数据库中有两个表(用户和OpenID):我计划检查OpenIDs表中是否存在Open ID,然后使用相应的UserID来获取用户的其余部分来自Users表的信息。

Users表由UserID编制索引,并包含以下列:

  • UserID(pk)
  • 电子邮件
  • 别名
  • OpenID(fk)

OpenIDs表由OpenID索引,并包含以下列:

  • OpenID(pk)
  • UserID(fk)

或者,我可以通过UserID和OpenID索引Users表(即有2个索引)并完全删除OpenIDs表。

在这种情况下,为具有匹配OpenID的用户改进查询的推荐方法是什么:使用两个键索引Users表或使用OpenIDs表查找匹配的UserID?

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

我不知道您将详细运行哪种查询,我建议将两个外键列索引为Users.OpenIDOpenIDs.UserID

索引外键通常是帮助处理JOIN条件和其他查询的好主意。

但老实说,如果你只使用OpenIDs表来检查OpenID的存在性,那么你只需索引(可能是一个唯一的索引吗?)就可以了。 Users表并完成它。现在你拥有的OpenIDs表根本没有任何实际意义 - 只是占用了冗余信息的空间。

除此之外:您需要观察应用程序的行为方式,对一些使用数据进行采样,然后查看哪种查询运行频率最高,时间最长,然后开始进行性能调整。不要过度进行提前性能优化 - 太多的索引可能比没有索引更糟糕了!

  

每次有人通过身份验证   有了他们的开放ID,我必须找到他们的   通过查找哪个用户具有的别名   给定OpenID,似乎就是这样   如果是主要的话,可能会相当慢   key是UserID(并且有   数百万用户。)

实际上,恰恰相反!如果你有一个在数百万行中独一无二的值,那么找到这个值实际上非常快 - 即使有数百万用户。它只需要少量(最多5-6个)比较,然后爆炸!你有一百万的用户。如果您在OpenID列上有索引,那么确实应该非常快。这样一个高度选择性的指数(一个价值百万分之一)非常有效地工作。