【问题标题】:sql userid + name + profile optimize questionsql userid + name + profile 优化问题
【发布时间】:2010-10-25 17:20:03
【问题描述】:

我可能需要做很多用户 ID->用户名查找。所以我在想,而不是像下面这样的表格

userid int PK
username text
userpass_salthash int
user_someopt1 int
user_sig text

把它分解成下面的样子

//table1
userid int PK
username text

//table2
userid int //fk
userpass_salthash int
user_someopt1 int
user_sig text

之所以这样做是因为我怀疑一个不太复杂的表(如果我愿意,我也可以使名称不再超过 32 字节)查找速度更快,而且数据更少。但我知道我可能错了,我应该做哪个版本,除了优化还有什么原因?

【问题讨论】:

    标签: sql database optimization


    【解决方案1】:

    您应该为规范化和性能执行第一个选项(单表)。

    性能:

    • 如果您在(UserId, Username) 上放置一个索引,您将拥有一个覆盖索引——因此您无论如何都不需要去表格获取用户名。
    • 如果您将聚集索引放在 UserId 上,您将获得聚集索引搜索 - 无论如何都会在行数据中结束。

    归一化:

    • 您的第二个选项允许用户存在于 table1 中,但不允许存在于 table2 中。由于您可能不希望没有密码的用户(无法登录),我认为这已损坏。

    我的建议是在 UserId 上建立一个聚集索引。如果您在其他地方需要聚集索引,覆盖索引几乎一样好。

    【讨论】:

    • +1 建议覆盖索引。聚集索引在一些 SQL 数据库中可用,OP 没有说明他使用的是哪个品牌。
    【解决方案2】:

    我同意对于这么窄的桌子,单桌几乎肯定是最好的选择。

    还要补充一点——文本数据类型(如果您使用的是 MS SQL Server)非常广泛。 nvarchar(200) 应该足够宽。谨慎使用 LOB 数据。

    【讨论】:

    • 对于 MSSQL,文本数据类型将存储在行外 - 因此它不会影响行大小。
    【解决方案3】:

    除非您确定有必要,否则请不要担心优化该查找。请记住优化俱乐部的规则。

    1. 优化俱乐部的第一条规则是,你不要优化。
    2. 优化俱乐部的第二条规则是,你不优化而不测量。
    3. 如果您的应用运行速度快于底层传输协议,则优化结束。
    4. 一次一个因素。
    5. 没有市场机器人,没有市场机器人时间表。
    6. 只要需要,测试就会继续进行。
    7. 如果这是您在优化俱乐部的第一晚,您必须编写一个测试用例。

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2023-03-31
      相关资源
      最近更新 更多