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条记录。
项目初期上线得急,很多东西都直接做了查库,匆匆忙忙就上线了本人也很无奈,(话语权不够)。

现有疑虑

  • 感觉写入数据量也不多,所以实际上感受到卡顿是来源查询上面的压力?
大人中
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 13

20几万?先优化sql吧

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

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

1个月前 评论

26万数据就做分表啊?

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

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

1个月前 评论

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

1个月前 评论
Linxb

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

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

1个月前 评论
66

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

1个月前 评论
cheer (楼主) 1个月前
cheer (楼主) 1个月前
66 (作者) 1个月前

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

1个月前 评论

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

1个月前 评论
lmaster

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

比如:

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

问题:

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

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

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

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

@cheer

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

下面有个回复说

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

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

1个月前 评论

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

1个月前 评论

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

4周前 评论
cheer (楼主) 4周前
MrHao 2天前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!