1 问题背景:
在程序启动时,数据处理时间很快,运行9h之后,对单张数据表处理时间长达5s。在对程序各个部分计时测量之后,发现时间主要消耗在mysql交互上,其中delete所占时间比例大概为90%。
2 具体信息
2.1 表结构&sql语句
服务中有9个进程按照固定周期写表:
其中8个进程执行语句:load data local infile ‘filename’ into test;
1个进程执行语句:insert into test (content) select content from temp_table;
其中的temp_table与test表结构相同,用来存储部分数据,按照指定周期更新。
处理test表的进程执行(服务中有8张test表,依次为test0-test7)
对于单张表执行
select content from test_n where seqno > lowThreshold;
process data
delete from test_n seqno where seqno < 处理完的数据的最大seqno
遍历8张表,重复执行上述操作
2.2 出现的问题现象:
当设置为2000qps时,服务在刚开始启动运行时,一切正常,单条数据处理时间约为0.0002s。
随着运行时间增加,单条数据处理时间逐渐减慢,大约1-2小时变化一次,在随后的一段时间保持在一个稳定数值。当运行时间达到9小时后,单条数据处理时间变为0.001s,为初始时间的5-6倍。
2.3 问题解决过程
2.3.1分析sql语句
在已知delete消耗时间增加的情况下:
当前引擎为innodb,行锁,在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键