MySQL 高并发写入,怎么优化性能?

需求:

  • 同一时间点有大量新用户注册要插入数据库
  • 同一时间点有大量的评论和记录要插入数据库

例如有一直播系统,直播开始时,同时有大量的新用户要注册和发表评论。如何解决这个写入性能问题?请问有好的解决方案吗?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 8

消息中间件吧

4年前 评论
yujiarong 4年前
十七岁程序员想当歌手 (楼主) 4年前
wanghan

这个有点难,等大佬回答

4年前 评论

用户注册和发弹幕这两个频率不在一个量级
用户注册随便搞搞直接存 MySQL
弹幕的话可能需要考虑先找个地方存好(redis, mongo), 定时写 MySQL

4年前 评论
十七岁程序员想当歌手 (楼主) 4年前
ninscious 4年前
hldh214 (作者) 4年前
十七岁程序员想当歌手 (楼主) 4年前
十七岁程序员想当歌手 (楼主) 4年前
wanghan 4年前
十七岁程序员想当歌手 (楼主) 4年前
十七岁程序员想当歌手 (楼主) 4年前
66

遇到同样问题 只是场景不一样,等大佬回复

4年前 评论
Complicated

这个最好是 写入redis,然后定时 灌到mysql里,单纯的操作库,不太好搞啊!

4年前 评论
wanghan 4年前
Complicated (作者) 4年前
wanghan 4年前
Complicated (作者) 4年前

@Complicated 是的,现有产品的实现方案就是先存redis,然后定时批量写入数据库(压力测试中单次写入1000条记录比分别写入快上百倍)。但同时也有一些问题发生了:

  • 和用户数据有关联的操作在未写入数据库时会出错(例如数据库关联查询的)。
  • redis 的数据可能有会丢失。例如:好像开始了持久化还是有可能会丢失最近一秒内的数据。
4年前 评论

把数据实时推送到消息kafka,用spark或者storm消费指定时间批次的数据,批量写入

4年前 评论
LOST
  • 注册还是直接写到数据库里面比较好,如果写到缓存里,万一这个时候缓存挂了,影响很不好。如果并发太大,可以考虑简化注册的业务流程,降低单次访问的计算量。
  • 弹幕这种,用消息队列就很合适了。

P.S. 我也没有经验,纸上谈兵而已。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!