MySQL减轻批量插入压力的,这种方案是否可行?

场景
在线答题的系统,每个用户每次开始一次考试的题目列表大概是在100~150道题目之间。
现在的做法是,用户开始考试就会创建一条exam_record的记录,每答一道题目就会提交一条exam_record_detail的记录,考试中还存在修改答案(写入或者修改行数据)。

现状

  • 项目运行了2个月左右,由于exam_record_detail表没有做水平分表,现在大概有26W条数据。
  • 在一个备考高峰时期,有不少用户反映存在卡顿的感觉。
  • 服务器配置
    带宽20Mb,单机配置
    MySQL减轻批量插入压力的,这种方案是否可行?

由于没做监控,所以现在也不知道具体瓶颈是在哪个地方。后知后觉上阿里云查看监控,才发现日志文件已经过期(看不到具体瓶颈是在磁盘IO上还是带宽上)

现在查看了数据库,大概在当天10~11点的高峰时期,exam_record 1700条记录,exam_record_detail 上面新增了3.6W条记录。
项目初期上线得急,很多东西都直接做了查库,匆匆忙忙就上线了本人也很无奈,(话语权不够)。

现有疑虑

  • 感觉写入数据量也不多,所以实际上感受到卡顿是来源查询上面的压力?
大人中
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 17

20几万?先优化sql吧

6个月前 评论
cheer (楼主) 6个月前
kebenxiaoming (作者) 6个月前
cheer (楼主) 6个月前

mysql 不背这个锅 这么点数据。应该是代码写的有问题

6个月前 评论

26万数据就做分表啊?

6个月前 评论
cheer (楼主) 6个月前
cheer (楼主) 6个月前

要先抓具体卡顿的点在哪 抓到响应时间较长的接口看一下是读比较慢 还是写比较慢 在做具体分析 20多w的数据如果索引是合适的 那数据库没啥压力

6个月前 评论

感觉并不需要分表,试试用一些压测工具模拟考试时候的并发,然后再排查问题

6个月前 评论
Linxb

用户开始考试就会创建一条 exam_record 的记录,每答一道题目就会提交一条 exam_record_detail 的记录,考试中还存在修改答案(写入或者修改行数据)

把这些数据先存在redis中,等用户交卷的时候在统一做数据库存储

6个月前 评论
66

先看慢查询吧,优化索引,然后再检查事务

6个月前 评论
cheer (楼主) 6个月前
cheer (楼主) 6个月前
66 (作者) 6个月前
xiaochen52113 4个月前
xiaochen52113 4个月前

500万只要索引对都不会卡的,你这个问题是什么问题....

6个月前 评论

统一回复下:
1.目前做了一次排查,发现日志处理方面的没有优化好,(存在同步本地文件写入的情况)。但目前做了一些优化,但是吞吐量还是低(已经用了内网去压测)。所以还在排查中,希望各位大佬轻点鞭笞我。
2.之前以为是落库的问题,所以自己想过的解决方案是把相关信息放在redis的hash里面,具体业务结束的时候再通过队列消耗,依次批量地100~150条数据落库,但论坛上大家说了不是数据库压力的话,目前此方案也没有具体地去实现。
3.虽然我在laravel社区里面发帖,不过这个项目用的基础框架是tp5.1。不过这锅肯定轮不到tp5.1背,所以还在排查中,一有思路,会把它更新上来的。

6个月前 评论
lmaster

@cheer 我觉得应该先分析数据生产与使用环节,在去定位关键点的代码、逻辑与资源等是否合理。

比如:

  • 数据基本都是在读?(数据使用)
  • 数据在段时间内集中写?(数据生产)

问题:

  • 大量数据读取是否有优化(语句、表结构、缓存机制)
  • 集中写时是否有优化(队列、统一写入、读写分离)

有些东西不一定要相信别人的,要自己分析,每个项目所遇到的问题可能都不一样。

mysql 在做插入和更新时是否有锁(行锁)这个会非常影响速度,所以在集中写时要多考虑

6个月前 评论
cheer (楼主) 6个月前
lmaster

@cheer

但有个困惑我的地方是在那几小并发的时间段,有一些以主键作为条件的 update 语句,执行时间居然高达 8 秒(该表普通索引还有两个)

下面有个回复说

update本身就有行锁机制在 ,这样就会导致 mysql会按顺序依次执行sql

而我所说的就是 mysql 在执行插入和更新是会自动加锁

5个月前 评论
cheer (楼主) 3个月前
lmaster (作者) 3个月前
cheer (楼主) 3个月前
lmaster (作者) 3个月前

跟用tp还是laravel无关,跟MYSQL本身基本无关,服务器配置也没关系。可以重点检查一下数据库、业务代码是否存在bug。这个数据量远达不到出现并发问题,数据量少基本不会出现数据库死锁情况。检查下最大请求量、数据库最大连接数。这种最好进行模拟测试,应该是代码本身有问题,前后端都检查一遍

5个月前 评论

我之前的项目 单表也快将近1000w的数据 也没有做分表啊 几十万不用做~

5个月前 评论
cheer (楼主) 5个月前
MrHao 4个月前

答题数据先存缓存里面,交卷的时候再存到数据库,这样不行吗

'exam_record_1'=>'{['题目编号','题目id','答案id','答案内容']}' 根据题目 id 获取题目的类型,根据题目类型来判断用答案 id 还是答案内容

4个月前 评论
wangchunbo
  1. 首先你慢查询log开了
  2. 先找最长的sql
  3. 分析sql,优化sql.
  4. 重复 2 3
  5. 都ok了,再试试.
  6. 再不行,就查看时间点的服务器并发折线图.
  7. 具体问题再具体分析,慢慢锁定.
4个月前 评论
cheer (楼主) 3个月前

你业务增加挺快的,我们公司做快3年也才15w份考试, 你们有自己题库么,题库数据量有多少 一般题库都百万级以上的。 可以压测一下你们试卷查询接口。

3个月前 评论
cheer (楼主) 3个月前

你看你俩多好的缘分 拿去撸 百万级数据库优化

3个月前 评论

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