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




