如何应对500万用户? ASP.NET 身份

2023-12-29

我正在运行一个 ASP.NET mvc5 应用程序,目前有 500 万用户。它托管在 Azure 云中。对于身份验证,我使用 EntityFramework 的 Asp.Net Identity。

但是,用户越多,注册功能就越慢。我尝试缩放数据库,但结果仍然相同。新用户注册大约需要 6-7 秒。

我还尝试搜索如何提高身份系统的性能,但我找不到任何相关的内容。

我真的很想听听是否有人知道如何提高它的性能。

更新:我在正在搜索的字段上有索引,而且我在 Azure 中选择的数据库订阅是具有 200 个 DTU 的 P3 SQL 数据库。

我分析了数据库,发现了一个可疑的选择查询。 我删除了一些投影并将它们替换为“....”,这样它就不会太长,您可以看到查询的内容。


SELECT 
    [UnionAll2].[Gender] AS [C1], 
    ....
    [UnionAll2].[UserName] AS [C27], 
    [UnionAll2].[C1] AS [C28], 
    [UnionAll2].[UserId] AS [C29], 
    [UnionAll2].[RoleId] AS [C30], 
    [UnionAll2].[UserId1] AS [C31], 
    [UnionAll2].[C2] AS [C32], 
    [UnionAll2].[C3] AS [C33], 
    [UnionAll2].[C4] AS [C34], 
    [UnionAll2].[C5] AS [C35], 
    [UnionAll2].[C6] AS [C36], 
    [UnionAll2].[C7] AS [C37], 
    [UnionAll2].[C8] AS [C38], 
    [UnionAll2].[C9] AS [C39]
    FROM  (SELECT 
        CASE WHEN ([Extent2].[UserId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
        [Limit1].[Gender] AS [Gender], 
        ....
        [Limit1].[UserName] AS [UserName], 
        [Extent2].[UserId] AS [UserId], 
        [Extent2].[RoleId] AS [RoleId], 
        [Extent2].[UserId] AS [UserId1], 
        CAST(NULL AS int) AS [C2], 
        CAST(NULL AS varchar(1)) AS [C3], 
        CAST(NULL AS varchar(1)) AS [C4], 
        CAST(NULL AS varchar(1)) AS [C5], 
        CAST(NULL AS varchar(1)) AS [C6], 
        CAST(NULL AS varchar(1)) AS [C7], 
        CAST(NULL AS varchar(1)) AS [C8], 
        CAST(NULL AS varchar(1)) AS [C9]
        FROM   (SELECT TOP (1) 
            [Extent1].[Id] AS [Id], 
            ....
            [Extent1].[UserName] AS [UserName]
            FROM [dbo].[Users] AS [Extent1]
            WHERE ((UPPER([Extent1].[UserName])) = (UPPER(@p__linq__0))) OR ((UPPER([Extent1].[UserName]) IS NULL) AND (UPPER(@p__linq__0) IS NULL)) ) AS [Limit1]
        LEFT OUTER JOIN [dbo].[UserRoles] AS [Extent2] ON [Limit1].[Id] = [Extent2].[UserId]
    UNION ALL
        SELECT 
        2 AS [C1], 
        [Limit2].[Gender] AS [Gender], 
        ....
        [Limit2].[UserName] AS [UserName], 
        CAST(NULL AS varchar(1)) AS [C2], 
        CAST(NULL AS varchar(1)) AS [C3], 
        CAST(NULL AS varchar(1)) AS [C4], 
        [Extent4].[Id] AS [Id1], 
        [Extent4].[UserId] AS [UserId], 
        [Extent4].[ClaimType] AS [ClaimType], 
        [Extent4].[ClaimValue] AS [ClaimValue], 
        CAST(NULL AS varchar(1)) AS [C5], 
        CAST(NULL AS varchar(1)) AS [C6], 
        CAST(NULL AS varchar(1)) AS [C7], 
        CAST(NULL AS varchar(1)) AS [C8]
        FROM   (SELECT TOP (1) 
            [Extent3].[Id] AS [Id], 
            ....
            [Extent3].[UserName] AS [UserName]
            FROM [dbo].[Users] AS [Extent3]
            WHERE ((UPPER([Extent3].[UserName])) = (UPPER(@p__linq__0))) OR ((UPPER([Extent3].[UserName]) IS NULL) AND (UPPER(@p__linq__0) IS NULL)) ) AS [Limit2]
        INNER JOIN [dbo].[UserClaims] AS [Extent4] ON [Limit2].[Id] = [Extent4].[UserId]
    UNION ALL
        SELECT 
        3 AS [C1], 
        [Limit3].[Gender] AS [Gender], 
        ....
        [Limit3].[UserName] AS [UserName], 
        CAST(NULL AS varchar(1)) AS [C2], 
        CAST(NULL AS varchar(1)) AS [C3], 
        CAST(NULL AS varchar(1)) AS [C4], 
        CAST(NULL AS int) AS [C5], 
        CAST(NULL AS varchar(1)) AS [C6], 
        CAST(NULL AS varchar(1)) AS [C7], 
        CAST(NULL AS varchar(1)) AS [C8], 
        [Extent6].[LoginProvider] AS [LoginProvider], 
        [Extent6].[ProviderKey] AS [ProviderKey], 
        [Extent6].[UserId] AS [UserId], 
        [Extent6].[UserId] AS [UserId1]
        FROM   (SELECT TOP (1) 
            [Extent5].[Id] AS [Id], 
            ....
            [Extent5].[UserName] AS [UserName]
            FROM [dbo].[Users] AS [Extent5]
            WHERE ((UPPER([Extent5].[UserName])) = (UPPER(@p__linq__0))) OR ((UPPER([Extent5].[UserName]) IS NULL) AND (UPPER(@p__linq__0) IS NULL)) ) AS [Limit3]
        INNER JOIN [dbo].[UserLogins] AS [Extent6] ON [Limit3].[Id] = [Extent6].[UserId]) AS [UnionAll2]
    ORDER BY [UnionAll2].[Id] ASC, [UnionAll2].[C1] ASC  

我的 EntityFramework 用户 POCO 类

    public class User : IdentityUser
    {
        [Index]
        public DateTime Created { get; set; }
        [Index(IsUnique = true), MaxLength(255)]
        public override string Email { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        [Index]
        public GenderType Gender { get; set; }
        [Index]
        public DateTime? Birthdate { get; set; }
        [Index, MaxLength(2)]
        public string Country { get; set; }
        [MaxLength(2)]
        public string Language { get; set; }
        [Index, MaxLength(256)]
        public string Referral { get; set; }
        public string ImageUrl { get; set; }
        [Index]
        public UserIdentityStatus IdentityConfirmed { get; set; }
        [Index]
        public DateTime? Deleted { get; set; }
        public ICollection<Reward> Ads { get; set; }
        public ICollection<Thought> Thoughts { get; set; }
        public ICollection<Achievement> Achievements { get; set; }
        public ICollection<Subscription> Subscriptions { get; set; }
        public DateTime? TutorialShown { get; set; }
        [Index]
        public DateTime? LastActivity { get; set; }
        [Index]
        public DateTime? LastBulkEmail { get; set; }
    }

我想我有解决方案给你。我做了另一个测试,第二个选项 - 计算列索引有效。以下是 sql 代码中的步骤,您可能可以使用 EF 注释执行相同的操作。

  1. 在表 users 上创建计算列作为 upper(username):

    更改表用户将 upper_username 添加为 upper(username)

  2. 在该列上创建索引:

    在 a_upload(upper_username) 上创建索引 ix2

就这样。 EF select 仍将使用 UPPER,但 MS SQL 优化器应该能够使用此索引,因为它与 where 子句中的函数具有相同的定义。

以下是我电脑上的测试结果:

测试sql:从a_upload中选择field001,其中up​​per(field001)='10'

BEFORE(SCAN意味着引擎必须一一读取所有记录)

在功能列上创建索引后(SEEK=引擎将利用索引)

不要感到困惑,即使在 BEFORE 场景中,sql 引擎也在使用索引 (ix1)。这只是因为我只选择“field001”并且优化器知道它不仅包含在表中而且也包含在索引中。并且索引的字节数比整个表少。但这并不意味着系统使用了索引,它必须为每个选择的每一行计算 upper() 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何应对500万用户? ASP.NET 身份 的相关文章

  • httpmodules httphandlers,它们的理想用途是什么?什么时候使用,什么时候不使用?

    我对 httpmodules 和 httphandlers 有一些疑问 我对它们的真正需要有点困惑 我创建了很多网站 但很少使用它们 当然我失去了不使用它们的好处 这些好处是什么 什么时候使用 什么时候不使用 您可以使用 httpmodul
  • 如何从重定向的查询字符串中删除项目?

    在我的基页中 我需要从查询字符串中删除一个项目并重定向 我不能使用 Request QueryString Remove foo 因为该集合是只读的 有没有什么方法可以获取查询字符串 除了该一项 而无需迭代集合并重新构建它 您可以通过处理原
  • 如何将现有 ASP.NET 网站转换为 HTML 5

    我有一个网站 首先由 Visual Studio 2005 创建 然后转换为 Visual Studio 2008 目前使用 Visual Studio 2008 在 Visual Studio 2010 Service Pack 1 之后
  • 在 Dapper 中处理 Oracle 数据库连接

    我正在尝试连接到 Oracle 数据库并尝试执行查询 下面是我的模型类 using System using System Collections Generic using System Linq using System Web usi
  • 在 Asp.Net MVC 视图中使用 dropdownlistfor 和 foreach 吗?

    我有一个带有 foreach 循环的视图 用于模型的列表属性 现在 我希望能够让用户使用下拉列表设置列表中每个项目的值 但我不知道该怎么做 当它不在 foreach 循环中时 我使用过类似的东西 Html DropDownListFor m
  • 什么可能会在一台服务器上导致此错误,而在另一台服务器上则不会?

    我们有一个连接到外部 Web 服务的 ASP Net 网站 几天前它突然停止工作 基本代码是这样的 Try request New ExternalWebService ProcessRequestService Error occurs
  • 在 ASP.NET 中动态设置主题

    我有一个连接到不同域的应用程序 我没有复制和修改每个应用程序 而是在硬盘驱动器上使用相同的物理位置 但在 IIS 上使用单独的应用程序池和网站 基本上我想根据主机名更改主题 IE 用户访问 websome com 获取 websome 主题
  • 在 Foreach 或 For 循环中使用 EditorFor (ASP.NET MVC + RAZOR)

    我目前正在实施一个家谱我的 ASP NET MVC 项目中的系统 为了设置家庭成员之间的关系 我需要每行显示两个 ComboBox DropDownList 来定义一个成员与另一个成员之间的关系 首先我将分享我的代码 然后我将解释到目前为止
  • 如果浏览器在 asp .net 中关闭,请从浏览器中注销?

    我的要求有点复杂 用户正在使用 Web 浏览器访问数据库 而在访问数据库时 如果用户关闭活动页面而不是注销会话 该会话需要自动注销 有人可以指导我如何做这个吗 我在母版页中使用了jquery onbeforeunload 我收到消息离开页面
  • ChannelFactory重用策略

    我一直在读到 ChannelFactory 的创建是昂贵的 除非有技术原因不这样做 否则应该在可能的情况下重用 ChannelFactory 或者通过某种方式缓存它们 或者使用工厂的静态实例 根据您的经验 您发现哪些 ChannelFact
  • 在多个网页(.cshtml 文件)中使用 Razor @functions

    我有以下功能 我希望可用于我的 asp net 网页 2 应用程序中的多个 cshtml 视图 如何使该功能可用于应用程序中的任何视图 而不是仅一个视图 functions public bool DisplayButton String
  • 向特定客户端发送消息以及消息发送用户

    我是 SignalR 的初学者 我创建了一个基于 SignalR 的基本聊天应用程序 我面临的问题是我想向特定客户端以及发送消息的用户发送消息 这个怎么做 我知道要向特定客户端发送消息 我们可以这样做 Clients Client Cont
  • 设置 runat=server 时输入名称和 id 发生变化

    在我的表单中 我需要插入 文本 类型的不同输入 输入必须是带有名称和 ID 的 html 控件 因为我将此表单发送到外部网址 对于验证 我在所有输入中执行 runat server 然后我可以使用 requiredfieldvalidato
  • 设置asp.net验证器的顺序

    我使用 3 个验证器来验证文本框 但当在文本框中输入无效值时 所有验证器都会被触发 但我希望这些验证器按照特定的顺序工作 以便用户可以一一解决这些错误
  • 基于网络的应用程序中的图表

    可使用 ASP NET 在网页上显示图表的各种图表工具有哪些 我了解 Dundas 和 Infragistics 等商业工具 我可以用谷歌搜索这个 但我想知道参与者使用过的各种工具 任何可用的免费图表工具也欢迎提及 如果您不介意使用 Fla
  • ASP.NET预编译的优点是什么?

    使用 Aspnet compiler exe 代替通过 Visual Studio 进行的传统发布有多有用 那么资源 resx 文件又如何呢 与简单的 xcopy 相比 预编译有两个主要优点 文件系统不会包含所有代码 aspx文件和后面的所
  • Asp.net错误无法加载文件或程序集[重复]

    这个问题在这里已经有答案了 可能的重复 计算机崩溃后 我的 Visual Studio 2010 将无法加载程序集 https stackoverflow com questions 4975455 after a computer cra
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 同时从2个表中删除?

    我正在使用 asp net 和 sql 服务器 我有 2 个表 类别和产品 在产品表中 我的categoryId 为FK 我想要做的是 当我从类别表中删除类别时 我希望该类别中的所有产品都将在产品表中删除 如何才能做到这一点 我更喜欢使用存
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数

随机推荐

  • 带联合查询的下拉菜单

    我正在开发一个预订系统 在我的预订表单中 我有一个下拉元素 它返回预订系统 仍然 可用的开始时间段 通过创建新的预订 我创建的查询工作正常 并且所有可用的开始时间段都正确返回 QUERY WHERE thistable id IN SELE
  • npm 安装错误 EPERM 不允许操作

    So when trying to run the angular4 project today my first error was npm install eperm operation not permitted so I thoug
  • 点击事件上的 JQuery .done

    我不是一名 javascript 开发人员 所以请耐心等待我 我需要在 jQuery 之后执行重定向click活动已完成 我有这个 但是申请不了 done to click 将整个事情包裹起来 when以太不起作用 printpng cli
  • shell脚本中${varname}和$varname有什么区别

    我有一个简单的问题 但我想知道两者之间有什么区别 varname and varname 我两者都使用 但我没有看到任何差异可以告诉我何时使用其中之一 Using 变量名称中的 有助于消除执行变量扩展时的歧义 考虑两个变量var and v
  • Java 8 中按映射列表分组

    我有一个这样的列表 List
  • Visual Studio 错误:抱歉,出了点问题 - 安装操作失败

    我试图通过添加 Python 开发和 Node js 开发来修改我的 Visual Studio 但它一直显示 抱歉 出了问题 安装操作失败 并且它不下载和安装这些功能 当我尝试卸载已安装的元素 例如 NET 桌面开发 或尝试卸载 Visu
  • 静态成员和增强序列化

    我在用着Boost 序列化 http www boost org doc libs 1 38 0 libs serialization doc index html归档课程的内容 成员变量之一是静态 std vector 归档和恢复进展顺利
  • “unistd.h”中函数“read”的读取限制是多少?

    标准unix C有这个函数 ssize t read int fd void buf size t count 但是这个 读取 函数一次可以读取的最大字节数是多少 From man read 2 http linux die net man
  • 用于 mac os x 应用程序开发的 aws sdk [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要为 MAC OS X 开发一个应用程序 该应用程序会将所选文件上传到亚马逊网络服务 但为此我需要适
  • 如何列出 Objective-C 中对象的所有字段?

    如果我有一个类 如何列出它的所有实例变量名称 eg interface MyClass NSObject int myInt NSString myString NSMutableArray myArray 我想获取 myInt myStr
  • 检索页面上多个 YouTube 播放器的播放器状态

    我有一个包含许多 YouTube 播放器的 HTML 我订阅 onStateChange 以在用户播放视频时收到通知 function onYouTubePlayerReady playerid var player document ge
  • 没有足够的存储空间来完成此操作

    我有一个带有计时器控件的 asp 页面 定时器控件会触发一些方法来执行 当加载此页面时 出现以下错误 并且计时器控件未触发滴答 我用的是IE9 FF和chrome都没有问题 错误详情如下 有人对这条消息有经验吗 网页错误详细信息 User
  • 如何在scss中使用祖父母选择器

    我需要使用不同颜色的图标将按钮组件设置为 5 种状态 并用于以下 css add member dialog add username to list to list button icon before content url image
  • 识别数据序列根据其他列 UserID 发生变化的情况

    我正在处理数据框df如下 Input TUserId SUID mid sum final sum 115 201 2 7 115 309 1 8 115 404 1 9 209 245 2 10 209 398 2 10 209 510
  • 如何转储部分二进制文件

    我有二进制文件 想要提取其中的一部分 从已知字节字符串 即 FF D8 FF D0 开始 以已知字节字符串 AF FF D9 结束 过去我用过dd从开始 结束处剪切二进制文件的一部分 但此命令似乎不支持我的要求 终端上的什么工具可以做到这一
  • 为什么 var_dump 不能处理 DOMDocument 对象,而 print($dom->saveHTML()) 可以?

    为什么不var dump与 一起工作DOM文档 https php net domdocument物体 同时print dom gt saveHTML 产生输出 Update 从 PHP 5 4 1 开始 您终于可以var dumpDOM
  • (Cocoa) 单窗口 Cocoa 应用程序中的 UIViewController 子类相当于什么?

    在尝试了 iOS 应用程序之后 我想尝试一下 Cocoa 应用程序 假设事情会非常相似 所以我有一个带有分割视图的单窗口应用程序和一些NSTableViews 想想iTunes 我正在寻找一个地方来放置我的代码 该代码将从网络获取数据来填充
  • ArrayList 容量大小增加奇怪的行为

    当 ArrayList 想要存储比实际容量更多的元素时 它会增加容量 这是非常经济高效的操作 因为我们实际上将所有数据从以前的 ArrayList 复制到容量更大的新 ArrayList 中 但是我想知道 当 ArrayList 只是需要更
  • 如何处理 Angular 和 Django 应用程序中的第一个请求

    我有一个问题 我的家乡网址是 而且在 Django 中我的主页 url 是 stateProvider state home url controller HomeController resolve cities getAvailbleC
  • 如何应对500万用户? ASP.NET 身份

    我正在运行一个 ASP NET mvc5 应用程序 目前有 500 万用户 它托管在 Azure 云中 对于身份验证 我使用 EntityFramework 的 Asp Net Identity 但是 用户越多 注册功能就越慢 我尝试缩放数