gpt4 book ai didi

sql-server - 每天 1000 万次统计更新 - 我应该使用什么数据库/缓存系统?

转载 作者:行者123 更新时间:2023-12-02 22:23:22 26 4
gpt4 key购买 nike

我的网站目前遇到性能问题。情况可以概括如下:

  • 这是一个使用 SQL Server 2012 Express 的 .Net Mvc 网站。它托管在 Windows Server 2012 上。
  • 核心系统每天约有 1000 万次 UPDATE 查询(2 个不同表上有 500 万次),另外 1000 万次用于自定义统计目的(同样是 2*500 万次)。
  • INSERT 查询要少得多。
  • MVC 网站没有性能问题,大多数请求由 1 个返回纯内容(而非 html)的方法处理。

由于统计数据并不像核心系统那么重要,而且我发现 SQL Server 遇到了很大的困难,因此我认为将这些统计数据表移到其他地方可能会更好。

主要问题是:处理以更新为主的统计数据的最佳方法是什么?这个想法也是只保留一台服务器。

我试图看看可以采取哪些措施来改善这种情况:

  • 在另一个硬盘上有一个单独的 SQL Server 数据库用于统计数据吗?也许 SQL Server 可以呼吸得更好,但我不确定。
  • 使用 NoSQL 数据库?我只是对 MongoDb 有一点经验(但不是数百万个请求),我很想尝试 RavenDB。
  • 使用缓存系统? Redis 看起来很棒,但我不确定在 Windows 上运行它是否是一个好主意。 AppFabric 是一个可行的选择吗?

任何与当前情况相关的想法将不胜感激。
谢谢

以下是有关我的统计表的更多信息:

TABLE [dbo].[UserStat](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NOT NULL,
[Hits] [int] NOT NULL,
[Points] [decimal](38, 6) NOT NULL,
[Date] [datetime] NOT NULL,
[LastHit] [datetime] NOT NULL,
[Ip] [varchar](256) NULL,
)

我像这样更新统计数据:

UPDATE [UserStat] SET Hits = Hits + 1, Points = Points + @Points, LastHit = @Last WHERE UserId = @Id AND [Ip] = @Ip AND [Date] = @Date

如果当前用户和日期的行不存在,我将创建它:

INSERT INTO [UserStat] ([UserId],[Hits],[Points],[Date],[LastHit],[Ip]) VALUES (@UserId,@Hits,@Points,@Date,@LastHit,@Ip)

有两个索引:

  • 1 为主键
  • 1 用于获取和聚合用户的统计信息

    INDEX [Select_UpdateUserStatNavigation] ON [dbo].[UserStat](
    [UserId] ASC,[Date] ASC) INCLUDE ([Id],[Hits],[Points], [LastHit],[Ip])

服务器是VPS。日志和数据文件位于同一磁盘上。表中不涉及外键。

以下是我发现的查询此表的所有 SELECT 查询:

SELECT Points, Hits, [Date] FROM [UserStat] WHERE UserId = @UId AND [Date] >= @date

SELECT Ip FROM [UserStat] WHERE UserId = @UId AND LastHit >= DATEADD(MINUTE,-15,getdate())

SELECT COUNT(Id) FROM [UserStat] WHERE [LastHit] >= DATEADD(MINUTE,-15,getdate())

但我并不真正担心 SELECT,更多的是 UPDATE 的数量 ^^。

最佳答案

这确实是一个非常简单且很好的示例,说明了何时适合使用 NoSql 数据库。 NoSql 是为“网络规模”应用程序创建的,例如这种应用程序,数据的速度和数量根本超出了 SQL 数据库的跟上能力(关系 DBMS 的一大弱点)。

事实上,常规 SQL 对于您的场景来说并不是一个好的选择。造成这种情况的原因有很多,包括:

  1. SQL 对于处理关系数据很有用。这里的数据没有真正的关系或依赖关系(至少,不是您所描述的那样),实际上,即使是适度复杂的关系数据集,在非规范化后也能更好地工作并放入 NoSql 平台。
  2. SQL 带来了大量的开销。由于查询解释、查找索引、查询索引、提取值等,仅运行查询从数据库获取单个值的成本至少是 NoSql 数据存储中的 3-5 倍,其中 NoSql 数据存储一步到位即可获得记录。
  3. SQL 数据库的设计主要是为了实现高度一致。这意味着它们通常不能驻留在多于一台机器上(尽管这不再完全正确),并且它们有额外的开销来确保数据保持一致。

现在,让我们看看您的特定用例:

  1. 大量更新事务,偶尔插入。大多数 NoSql 数据库平台使用 Set 操作,根据需要进行更新或插入。无需每次都运行两个语句来执行此操作。

  2. 单个主键。NoSql 数据库是键值存储,其中您的键(在本例中为 UserId)指向数据库中的单个记录.

  3. 简单的统计和索引。一些 NoSql 数据库提供内置索引功能,有些甚至允许您对数据进行映射缩减以获取详细的统计信息。其他人会自动进行数据聚合,您可以编写特殊查询来获取您需要的数据。在这种情况下,您的“Stat Id”字段毫无用处,可以删除(是的,占用的存储空间更少!)。

  4. 快速且可扩展。这是 SQL 数据库不会触及的东西。 NoSQL 就是为此而设计的。

鉴于上述情况,您的场景是何时应用 NoSql 解决方案的教科书示例。我可以推荐 Couchbase ,这是一种速度极快的内存数据库,具有基于磁盘的存储(这可以一次性满足您的缓存和数据存储需求)。您也可以考虑Elasticsearch对于您的统计存储,因为它可以立即执行一些非常好的数据聚合。无论您选择哪种 NoSql 解决方案,您都将获得灵活的可扩展性和易于维护性。我敢说您作为全职 DBA 的日子将会结束。

关于sql-server - 每天 1000 万次统计更新 - 我应该使用什么数据库/缓存系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28275281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com