ASP.NET Identity - 更改代码首先生成的数据库字段长度以提高性能

Posted

技术标签:

【中文标题】ASP.NET Identity - 更改代码首先生成的数据库字段长度以提高性能【英文标题】:ASP.NET Identity - change code first generated database field lengths for performance 【发布时间】:2017-06-30 16:26:22 【问题描述】:

我正在使用 ASP.NET MVC 5 标识。我首先允许 EF 代码为我创建数据库表。 PasswordHash、SecurityStamp 和 PhoneNumber 都是 nvarchar(MAX) - 但是当我查看它们的内容时,它们要短得多。

对于我的主要 DAL,我使用的是 Dapper - 尽管我让 EF 处理身份。

出于数据库性能的原因,我是否可以缩短这些 MAX 字段,同时保证 Identity 仍然正常运行 - 如果可以,长度是多少?

(我假设我可以使用 PhoneNumber 做任何我喜欢的事情,因为我可以控制该字段的内容 - 但我不太确定其他 2 个)。

我在网上找不到任何提及此事的内容。

【问题讨论】:

性能原因?你真的认为会有帮助吗?任何性能问题的必填链接:ericlippert.com/2012/12/17/performance-rant 拥有大量 MAX 字段并不是一个好习惯,而且这里似乎真的没有充分的理由。但是,嘿,当你使用 EF 时,你无论如何都会被淹没;)性能不仅仅是“服务器可以接受它” - 它是“这可以更具响应性”,更好的性能是从扩展到响应的许多方面的胜利磁盘使用时间。 您是对的,但您不太可能拥有数百万用户,因此这不是真正的问题。 另外,也许我应该更多地表述这一点,而不是具体确定的性能;我认为你正在提出的观点。 【参考方案1】:

我不确定它对性能有多大帮助,但您可以使用 fluent API 配置您的身份属性:

public class YourContext : IdentityDbContext

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        //Make you you do this BEFORE the code below
        base.OnModelCreating(modelBuilder);

        //Assuming your user class is called "User" here:
        modelBuilder.Entity<User>()
            .Property(e => e.PasswordHash).HasMaxLength(100);

    

但请注意,如果您使这些字段与身份框架想要插入的值不兼容,那么您将遇到问题。所以我会推荐一个相当大的最大长度值。

【讨论】:

谢谢。所以没有文档说明这些字段需要多长时间? 不知道他们需要多长时间,但这可能会提供更多信息***.com/questions/20621950/… 把它颠倒过来——这样做有什么好处吗?作为一项规则,我喜欢让事情尽可能接近样板。如果更改这些值没有什么好处,我想我会保持原样。【参考方案2】:

nvarchar(x) 与 nvarchar(Max) 的 SQL Server(我假设这是您使用的)性能的差异在于您对这些字段进行搜索时。 IE。 select * from users where phoneNumber='123456789'

但是您提到的字段不受标准身份模板中任何地方的where 子句的约束。甚至SecurityStamp 也没有,PasswordHash 也绝对没有。通过电子邮件、用户名、ID 搜索用户。这些对您来说长度是有限的 - 256 个字符(see source,滚动到OnModelCreating)。在UserName 列上应用了索引。

因此,您所说的任何性能原因都不存在。

如果您通过电子邮件进行大量查找,您可以在 Email 列上应用索引 - 这与您获得的性能一样多。电话号码也是如此 - 如果您通过电话号码查找用户,则将该列设置为有限长度并应用索引是有意义的。

【讨论】:

谢谢 - 我应该用不同的方式来表达这个问题,而不仅仅是关于性能。所以基本上只是坚持所有默认字段长度不太可能有现实世界的缺点,对吧?更改它们几乎没有好处(不仅是 MAX 列,还有,例如,将电子邮件长度从 nvarchar(256) 更改为 nvarchar(100)?) 没有充分的理由仅仅为了做这件事而做。除非您要节省存储字节数:documentation 中的“每个非空 varchar(max) 或 nvarchar(max) 列都需要 24 个字节的额外固定分配”。但不知何故,我觉得你并不真正关心 24 字节。 "...性能影响很小,所以除了最大的应用程序之外,它并不是什么大问题,但如果您知道您的数据可以适合 varchar(n) 字段,那就更好了使用比使用 max 更大的 n 值。max 是一个安全网,但如果你不需要它,就不要放它。 social.msdn.microsoft.com/Forums/sqlserver/en-US/… 更多关于显着性能差异的信息 - (MAX) 在某些情况下会慢 50%(尽管在非常高的负载下是这样)rusanu.com/2010/03/22/… 我现在的想法是 - 如果没有充分的理由使用 MAX,请不要使用它。

以上是关于ASP.NET Identity - 更改代码首先生成的数据库字段长度以提高性能的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Identity 更改密码

如何在 ASP.Net MVC Identity 2 中更改密码验证?

使用 ASP.NET Identity 时如何更改表名?

如何更改 asp.net identity 3 (vnext) 使用的表名?

在 ASP.NET Core 中使用基于本地存储的 JWT-Token 更改用户密码(ASP.Identity)

asp.net-identity 交易问题