目前大部分WEB系统都是构建在DB基础之上的,随着用户越来越多,访问量越来越大,时间一长,库,表就会十分的庞大,系统就会变得越来越慢。对于有些记录如用户的基本信息,可以通过分库,分表加DB cache之类的给解决掉,而有些记录未必有必要保存那么多,譬如用户的交易记录,用户有可能就关心最近几个月的交易记录,如果还做一些分库分表之类的操作,DB就得做改动,相应的上层的程序都得要变,工作量大,而且也没有这个必要,删除历史久远的数据不影响用户体验,对于这一部分的数据,可以采取把部分历史数据进行归档,归档后从数据库当中删除掉,而历史删除方式一般有如下两种,一种是定时删除,一天或者一个星期删除一次,另外一种是启动一个后台程序删除历史数据,对于定时删除来说,一般是处在业务量很少或者停机维护时候做,而对于启动后台程序进行数据删除操作就牵涉到锁表,一锁表就有可能影响到线上的业务。而对于历史记录,一删除有肯能就有很多条记录,执行时间相对就比较的长,如果不采用好的策略,就将锁表很长时间,影响正常的业务,在mysql种由于没有循环删除的功能,如果该表未建立索引,删除一个很少的数据量,占有的时间也是很长的,如果有索引的话还牵涉到索引碎片的问题,我想到的做法是根据主键ID,计算一段时间内的最小的ID,和最大的ID分表为多少,每次拿最少的ID加上要删除的数目,再由后台程序判断是否大约最大的ID,每次循环删除,每次删除直接设定一个时间间隔,这样基本上把对线上的业务影响减少到最少,还有一种数据基本上,用户不用,公司需要进行记录并分析加以利用,譬如用户的浏览行为。目前大部分公司都会采用mysql主从架构之类系统,mysql有个blackhole的存储引擎,改存储引擎的特点是,不管写入任何东西都是有去无回,但是他的所有操作都会记录binlog,那么我们就可以在从上通过binlog重新构建出一个相同的表出来,进行数据挖掘。