如何快速删除海量数据?分布式常见面试题:如何快速删除海量数据?
比如删除几百万的数据,这个问题并不常见,但是对于中级以上的程序员的面试来说还是经常会被问到的。这块除了考察有没有处理海量数据的经验以外,还有一点就是考察对整个数据库存储原理的理解。都知道要想数据库查询的快得建索引,一级索引二级索引,所以对于一些常见的查询字段一般是要去建索引的。
像用户表除了主键索引D以外,你还要建像二级索引,比如说用户名、手机号、用户身份等等。每加一个索引其实你就相当于加了一棵索引树,就是所谓的b+树,按照顺序来做好排列方便检索,这是一般的处理逻辑。
但是如果遇到了海量的数据的删除的时候,比如对于一些过期的操作日志,无效的用户数据、大数据分析的临时库等等。为了减少存储空间提高性能,或者是保证数据的传授效率或者是精度等等,这些情况数据是要被定时清掉的。其实对于少量的数据来说怎么玩都行,根本不会出现什么性能问题。
但是一旦量上来了,要删除几百万的数据可能要花费好几个小时。主要原因还是在索引这一块,因为每删除一条记录就要在对应的索引树里面,你的主键索引二级索引都需要删掉相应的节点然后重新排序。索引加的越多,删除的数据肯定就会越来越慢。几百万的数据你要花费好几个小时是很正常的一件事情,但是对于线上环境来说这个时间有点过长了肯定是不行的。
那么怎么优化比较常见的操作方式就是先去掉表的索引,除了删除数据需要用到的索引以外,其他的索引全部删掉,这个过程可能要花费好几分钟,这样你去删除数据就会很快。删完数据之后再把索引再加回去,删除数据之后表的数据没那么多了加索引也就很快了,这是一种处理方式。当然如果保留的数据不多也可以直接去见临时表存储,然后再truncat你的原表,这样的处理方式相对前一种会更加的快。
另外还有一点需要注意,就是删除海量数据之后会发现表的查询变慢了,比较奇怪,这个一般是表的高水位线引发的问题,一般是删除数据或者插入数据所含不连续带来的页内数据空洞。虽然看起来可能数据量很小,实际上因为这些空洞占用的空间却很大,这块就需要我们在删除了海量数据之后去做一下表空间的压缩,这样才不会影响到数据库的查询。
好了,本期的视频就是这些了,如果您对本期的内容有任何疑问,欢迎大家在评论区给我留言,谢谢大家。