【问题标题】:How to properly index my database to increase query performance如何正确索引我的数据库以提高查询性能
【发布时间】:2011-06-30 21:52:55
【问题描述】:

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

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

Users 表由 UserID 索引并具有以下列:

  • 用户 ID (pk)
  • 电子邮件
  • 别名
  • OpenID (fk)

OpenIDs 表由 OpenID 索引并具有以下列:

  • OpenID (pk)
  • 用户 ID (fk)

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

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

【问题讨论】:

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


    【解决方案1】:
    【解决方案2】:

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

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

    但老实说,如果您只使用OpenIDs 表来检查OpenID 的存在,那么您最好只在Users 表中索引(可能是唯一索引?)该列并完成它。您现在拥有的 OpenIDs 表根本没有任何实际用途 - 只是为冗余信息占用空间。

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

    每次有人通过身份验证 用他们的 Open ID,我必须找到他们的 通过查找哪个用户拥有别名 给定 OpenID,似乎它 可能会相当慢如果主 关键是用户ID(并且有 数百万用户)。

    其实恰恰相反!如果您有一个在数百万行中唯一的值,那么找到该值实际上非常快——即使有数百万用户。只需进行少量(最多 5-6 次)比较,然后砰!你有一百万个用户。如果您在 OpenID 列上有索引,那确实应该很快。这样一个高度选择性的索引(一个值可以选择百万分之一)非常有效地工作。

    【讨论】:

    • marc_s,我现在只做简单的查询:只需找到具有匹配 OpenID 的用户。我认为 OpenIDs 表也可能是多余的,所以我将坚持使用 OpenID 作为索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2015-02-24
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    相关资源
    最近更新 更多