在真实的业务场景中,我们肯定是遇到过有时候需要大批量的数据要进行入库或者是更新。这时候我们在执行这种插入,或者是更新的时候肯定会遇到数据库效率的问题,我们首先能想到的是让事物尽量保持一致,统一去提交事务,这样肯定会有一定的效率提示。
ok。在我们在考虑了这个事情之后,我们可以在来看一下表里是否存在索引,如果存在索引,我们可以做一个这样的操作:首先在插入大量数据的时候,先把索引废除掉,等插入完成后在把索引重新建立。我在这里做了一个简单的实验,整理了一下实验的结果,有了下面的一个执行效率的图。
实验是我们有一张T表,T表中有29W左右的数据,首先我们为T表建立N个索引,在去插入T表一遍原有的数据是15秒,而T表中没有索引的时候我们插入的时间是2秒左右,但是索引建立的时间慢了一点,但是肯定不会超过15秒,所以我们效率的提升还是很明显的。(T表建立这么多索引只是为了实验效果明显一些,是为了弥补数据量没有那么大)
这个时候我们可以总结一下:在插入数据之前先让索引暂时失效,插入完成之后,我们在重新建立索引,虽然在插入完成后再去重新建立索引。有了这样的操作我们的大批量的数据操作的效率会提升很多,但是需要注意的是,在重建索引的时候如果那张表在其他地方使用中,有可能会导致索引的建立失败,所以这种操作适合在系统使用量比较小的时候使用,例如在执行定时任务的时候,或者深夜需要更新或插入大量数据的时候去做。
索引会导致插入或者更新慢的原因:因为索引是需要维护的当数据越大,索引需要维护的量越大,而这个维护的操作需要的代价是很高的,所以上面的操作可以使大批量的新增或者更新有了飞的提升。(其实,这个实验是源于我们公司有个需求是每天在一个时间需要进行大批量的插入和更新,本来是有这样的操作,但是公司请了一个DBA之后,DBA觉得这个操作是没有必要的,当时又没有人知道这个操作是为了什么,就让我们去掉这个操作,在他们私下讨论中我偶然听到说我们开发水平低,对于数据库的机制不了解,所以才有这些没用的操作,我就很不服,所以才有了以上的实验)