项目简介:
之前有一个项目涉及到订单支付功能,刚开始上线的时候订单数量很少,加上产品的设计,订单数据就存储在一张表中,而且订单状态是由定时任务来维护更新的,所以该表存在很大频次的访问。
运行了大半年之后,发现接口请求有点慢,客户反馈之后到服务器上查询,发现mysql的CPU高达300%,任务出现堆积,接口访问越来越慢,出现了雪崩的现象,最后发现订单表数据有14万条,由于订单表涉及字段较多,20多个字段,这才意识到问题的严重性,抓紧调整定时任务的频率,才降下来CPU,维持在120%左右,安排人员抓紧时间修复。
对订单表进行按月切表。做法是:把原表的数据按支付时间切分到相应的月表中,再删除原表的数据,这样对于后端代码修改最少。数据切分出去了,一个月也就几千条数据,查询效果也好很多,但是发现查询切分出去的表比原表查询要快几十ms,觉得很奇怪,原表数据还没有切分出去的表数据多,为啥查询还要慢一些呢,查看表详情,发现Index Size和Free Data Size依然很大,切分出去的表很少,原表却很大,经过查询之后才知道表空间碎片的东西,所以才上来记录一下~
碎片产生的原因
(1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白、被留空,而在一段时间内的大量删除操作,会使这种留空