MySQL减轻批量插入压力的,这种方案是否可行?
场景
在线答题的系统,每个用户每次开始一次考试的题目列表大概是在100~150道题目之间。
现在的做法是,用户开始考试就会创建一条exam_record的记录,每答一道题目就会提交一条exam_record_detail的记录,考试中还存在修改答案(写入或者修改行数据)。
现状
- 项目运行了2个月左右,由于exam_record_detail表没有做水平分表,现在大概有26W条数据。
- 在一个备考高峰时期,有不少用户反映存在卡顿的感觉。
- 服务器配置
带宽20Mb,单机配置
由于没做监控,所以现在也不知道具体瓶颈是在哪个地方。后知后觉上阿里云查看监控,才发现日志文件已经过期(看不到具体瓶颈是在磁盘IO上还是带宽上)
现在查看了数据库,大概在当天10~11点的高峰时期,exam_record 1700条记录,exam_record_detail 上面新增了3.6W条记录。
项目初期上线得急,很多东西都直接做了查库,匆匆忙忙就上线了本人也很无奈,(话语权不够)。
现有疑虑
- 感觉写入数据量也不多,所以实际上感受到卡顿是来源查询上面的压力?
20几万?先优化sql吧
mysql
不背这个锅 这么点数据。应该是代码写的有问题26万数据就做分表啊?
要先抓具体卡顿的点在哪 抓到响应时间较长的接口看一下是读比较慢 还是写比较慢 在做具体分析 20多w的数据如果索引是合适的 那数据库没啥压力
感觉并不需要分表,试试用一些压测工具模拟考试时候的并发,然后再排查问题
把这些数据先存在redis中,等用户交卷的时候在统一做数据库存储
先看慢查询吧,优化索引,然后再检查事务
500万只要索引对都不会卡的,你这个问题是什么问题....
统一回复下:
1.目前做了一次排查,发现日志处理方面的没有优化好,(存在同步本地文件写入的情况)。但目前做了一些优化,但是吞吐量还是低(已经用了内网去压测)。所以还在排查中,希望各位大佬轻点鞭笞我。
2.之前以为是落库的问题,所以自己想过的解决方案是把相关信息放在redis的hash里面,具体业务结束的时候再通过队列消耗,依次批量地100~150条数据落库,但论坛上大家说了不是数据库压力的话,目前此方案也没有具体地去实现。
3.虽然我在laravel社区里面发帖,不过这个项目用的基础框架是tp5.1。不过这锅肯定轮不到tp5.1背,所以还在排查中,一有思路,会把它更新上来的。
@cheer 我觉得应该先分析数据生产与使用环节,在去定位关键点的代码、逻辑与资源等是否合理。
比如:
问题:
有些东西不一定要相信别人的,要自己分析,每个项目所遇到的问题可能都不一样。
mysql 在做插入和更新时是否有锁(行锁)这个会非常影响速度,所以在集中写时要多考虑
@cheer
下面有个回复说
而我所说的就是 mysql 在执行插入和更新是会自动加锁
跟用tp还是laravel无关,跟MYSQL本身基本无关,服务器配置也没关系。可以重点检查一下数据库、业务代码是否存在bug。这个数据量远达不到出现并发问题,数据量少基本不会出现数据库死锁情况。检查下最大请求量、数据库最大连接数。这种最好进行模拟测试,应该是代码本身有问题,前后端都检查一遍
我之前的项目 单表也快将近1000w的数据 也没有做分表啊 几十万不用做~
答题数据先存缓存里面,交卷的时候再存到数据库,这样不行吗
'exam_record_1'=>'{['题目编号','题目id','答案id','答案内容']}'
根据题目 id 获取题目的类型,根据题目类型来判断用答案 id 还是答案内容你业务增加挺快的,我们公司做快3年也才15w份考试, 你们有自己题库么,题库数据量有多少 一般题库都百万级以上的。 可以压测一下你们试卷查询接口。
你看你俩多好的缘分 拿去撸 百万级数据库优化 。