我正在使用OpenID处理简单的登录页面:如果用户刚刚注册了OpenID,那么我需要在数据库中为用户创建一个新条目,否则我只是用问候语显示他们的别名。每当有人使用他们的Open ID进行身份验证时,我必须通过查找哪个用户具有给定的OpenID来找到他们的别名,并且如果主键是UserID(并且有数百万用户),它似乎可能相当慢。 / p>
我正在使用SQL Server 2008,我的数据库中有两个表(用户和OpenID):我计划检查OpenIDs表中是否存在Open ID,然后使用相应的UserID来获取用户的其余部分来自Users表的信息。
Users表由UserID编制索引,并包含以下列:
OpenIDs表由OpenID索引,并包含以下列:
或者,我可以通过UserID和OpenID索引Users表(即有2个索引)并完全删除OpenIDs表。
在这种情况下,为具有匹配OpenID的用户改进查询的推荐方法是什么:使用两个键索引Users表或使用OpenIDs表查找匹配的UserID?
答案 0 :(得分:4)
答案 1 :(得分:2)
我不知道您将详细运行哪种查询,我建议将两个外键列索引为Users.OpenID
和OpenIDs.UserID
。
索引外键通常是帮助处理JOIN条件和其他查询的好主意。
但老实说,如果你只使用OpenIDs
表来检查OpenID
的存在性,那么你只需索引(可能是一个唯一的索引吗?)就可以了。 Users
表并完成它。现在你拥有的OpenIDs
表根本没有任何实际意义 - 只是占用了冗余信息的空间。
除此之外:您需要观察应用程序的行为方式,对一些使用数据进行采样,然后查看哪种查询运行频率最高,时间最长,然后开始进行性能调整。不要过度进行提前性能优化 - 太多的索引可能比没有索引更糟糕了!
每次有人通过身份验证 有了他们的开放ID,我必须找到他们的 通过查找哪个用户具有的别名 给定OpenID,似乎就是这样 如果是主要的话,可能会相当慢 key是UserID(并且有 数百万用户。)
实际上,恰恰相反!如果你有一个在数百万行中独一无二的值,那么找到这个值实际上非常快 - 即使有数百万用户。它只需要少量(最多5-6个)比较,然后爆炸!你有一百万的用户。如果您在OpenID
列上有索引,那么确实应该非常快。这样一个高度选择性的指数(一个价值百万分之一)非常有效地工作。