【问题标题】:Concurrent inserts mysql - calling same insert stored proc before the first set of inserts is completed并发插入mysql - 在第一组插入完成之前调用相同的插入存储过程
【发布时间】:2017-08-22 11:30:55
【问题描述】:

我在社交网站上工作,其中包括媒体内容的创建,还记录用户与创建的内容的交互。

问题背景 - 目前使用的方法

有一个名为 news-feed 的页面,它显示了他们在站点上关注的用户的内容和使用该内容完成的活动。

内容的显示顺序会随着用户交互的增加而变化(例如,如果帖子上的 cmets 数量较多,则可能会显示在 cmets 数量较少的帖子之上。但是,cmet 的数量只是用于对帖子进行排名的属性之一)。

我使用mysql(innodb)数据库来存储数据如下:

  1. activity_master : 允许作为新闻提要的一部分的活动(发布、评论等)
  2. activity_set : 用于聚合同一对象上的活动
  3. activity_feed:实际活动的详细信息

详细的ER图在问题的末尾

场景

  1. 一个用户(有 1000 个关注者)发布了一些内容,这会启动对过程的异步调用,以便在上述表格中为所有关注者插入相关条目(1000 行,1000 个关注者)。
  2. 一些追随者在上述调用完成之前开始评论(允许成为新闻提要的一部分的活动),这会启动对同一过程的另一次调用,以插入该活动的条目(x 他们自己的追随者总数)为其特定集合的追随者。 (例如用户 B 对此帖子发表了评论)
  3. 所有插入请求(似乎太多)都必须由 innodb 引擎在队列中处理

问题

  1. 有没有更好更有效的方法来做到这一点? (我绝对认为会有一个)
  2. innodb 在默认配置下可以处理多少个插入请求?
  3. 在这种情况下如何避免死锁(或数据库端的资源拥塞)
  4. 或者是否有任何其他类型的数据库最适合这种情况

感谢您通过阅读说明表现出您的兴趣,非常感谢您在这方面的任何帮助,如果需要任何进一步的详细信息,请告诉我,提前致谢!

ER Diagram of tables (not reputed enough to embed the image directly :( )

【问题讨论】:

  • 有3种基本方式: 1. 1条帖子为1000个关注者创建1000行。 2. 1 个帖子 = 1 行,但当用户想查看他的时间线时,请加入关注者。 3. 1 和 2 的任意组合。通常(与您的问题一样广泛)有很多关于 twitter 和 facebook 如何做到这一点的文档。所以也许看看那个以获得灵感。他们都发布了特殊的 mysql 版本来满足他们的需求。他们也使用其他数据库系统(所以也许可以尝试一下)。要了解您的系统可以处理多少请求:测量它。对于简单的查询,它可能在 200/s 和 10k/s 之间。
  • @Solarflare 感谢您的回复。我已经阅读了 twitter 和 facebook 正在使用的方法,因此,我决定在写入时使用扇出并为 1000 个用户创建 1000 行。但是,这里提出的问题是不同的,如果在非常短的时间内对存储过程进行这样的调用,则会出现问题。如何处理这种情况是问题
  • 如果您决定走那条路,剩下的将取决于您的要求。对您的系统进行基准测试,您将获得可以支持的推文*追随者/秒的估计。如果你例如只期望 1 个帖子/秒,它应该适用于每个系统。你可以通过获得更快的存储和更多的内存来改进它,尽管这种方法是有限的(首先是你的预算,然后是原则设计问题)。在某些时候,您需要找到方法来进行负载平衡/延迟写入和同步/分片/... MySQL,至少单独而言,将通过这种方式达到其极限(您可以通过编写自己的克隆来扩展)。跨度>

标签: mysql performance database-design scalability database-performance


【解决方案1】:

经验法则:“不要排队,直接去做”。

插入 1000 行可能是站不住脚的。明天就10000了。

你不能在选择端而不是插入端进行处理吗?

【讨论】:

  • 感谢您抽出时间阅读我的问题并尝试提供帮助,1. 据我所知,默认情况下,innodb 会将所有插入排队,并且不确定如何将其关闭(以防其可配置) . 2. 好吧,我可以在选择端进行处理,但我的主要目的是让读取速度非常快。我肯定有兴趣在插入期间进行灭火。但是,如果它以数据不一致为代价,那么我将不得不寻找替代方案,例如 mysql 上的 redis 层,以优化 Web 应用程序的读取速度
  • 不,InnoDB 立即执行所有查询。但是,它会延迟非唯一二级索引的更新,但这是透明的。
  • 另一方面,除非您使用tx_isolation = READ UNCOMMITTED,否则其他事务在事务为COMMITted 之前不会“看到”插入。这不是“排队”或“延迟”。
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2021-10-14
  • 2016-09-11
相关资源
最近更新 更多