要造一千万行订单数据,脚本循环单条 insert,四十分钟才两百万行,压测排期全被数据准备吃掉。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
LOAD DATA LOCAL INFILE 'orders.csv' INTO TABLE orders; rewriteBatchedStatements=true insert into orders values (?),(?),(?);
每条插入一次事务一次网络往返,单线程还要维护全部索引,数据量一大时间全花在往返和索引更新上,换更强的机器也快不了多少。这一点先确认清楚,后面就不用反复试。
「压测数据生成」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
具体做法是,改成批量提交每批一千行;生成阶段先关掉非必需索引;用数据库自带导入工具代替逐条插入。
改完照着核一遍,一千万行在十分钟内导完,行数和校验和都对得上。
