当前位置: 首页 > 网络应用技术

100,000个数据分批插入。我该怎么做?

时间:2023-03-06 12:56:56 网络应用技术

  @[TOC]上周,兄弟歌曲转载了一份数据批次插入文章。我与您讨论了批处理数据插入的问题。

  阅读文章后,一个小朋友提出了不同的意见:

  Song兄弟与Bug交谈,并基本上理解了这个小朋友的含义,所以我本人也写了一个测试案例,今天对本文进行了组织,我希望能与我的朋友讨论这个问题。小朋友提出了一个更好的计划。

  在插入此问题的批处理中,我们使用JDBC进行操作,但实际上是两个想法:

  哪个快?

  我们从两个方面考虑了这个问题:

  让我们首先谈论第一个解决方案是插入一个for循环周期:

  此外,第二个解决方案是生成SQL插入:

  因此,我们最终必须考虑的是我们在互联网上花费的时间,是否超过了SQL插入时间?这是我们必须考虑的核心问题。

  接下来,让我们进行一个简单的测试,并批量插入50,000个数据。

  首先准备一个简单的测试表:

  接下来,创建一个Spring Boot项目,介绍MyBatis依赖项和MySQL驱动程序,然后在应用程序中配置数据库连接信息。

  每个人都需要注意,此数据库中有一个参数RWRITEBATCHEDSTAEMENTS连接URL地址,这是核心。

  MySQL JDBC驱动程序默认情况下会忽略该语句,拆卸我们期望的一组句子,然后将它们逐一发送到数据库。批处理插入实际上是一个单个插入,它直接导致较低的性能。将参数设置为数据库驱动程序,以帮助我们分批执行。

  好,所以准备工作。

  首先,让我们看一下测试1测试,即一个一个一个插入(实际上是批处理处理)。

  首先创建相应的映射器,如下:

  相应的XML文件如下:

  服务如下:

  在这里,我想谈论:

  尽管这是插入的一部分,但我们必须启动批处理模式(批次),以便您仅使用此SQLSession。如果您不使用批处理过程模式,则会花费大量时间获得连接和释放连接。效率很低,这种低效率方法不会测试Matsushi。

  接下来,编写一个简单的测试界面以查看:

  编写一个简单的单元测试:

  可以看出,需要901毫秒,而5W数据的插入小于1秒。

  第二个方案是生成SQL并插入它。

  映射器如下:

  相应的SQL如下:

  服务如下:

  然后在单元测试中调整此方法:

  您会看到,插入50,000个数据需要1805毫秒。

  可以看出,生成SQL的执行效率仍然更糟。

  此外,应该注意的是,第二个解决方案中还有另一个问题,也就是说,当数据量较大时,生成的SQL将特别长。MySQL可能一次无法处理如此大的SQL。在此时间之前,处理了插入的数据,这些操作将导致更长的插入时间。

  显然,计划更有利。当批量插入100,000或200,000个数据时,计划的优点将更加明显(第二个解决方案需要修改MySQL配置或处理插入数据以进行片段化)。

  小朋友知道,实际上,Mybatis Plus中有一种批处理方法。让我们看一下其实施来源:

  可以看出,这里的sqlStatement是一个,它是一个一个插入的。

  让我们看一下ExecuteBatch方法,如下:

  请注意回报的第三个参数,这是lambda表达式,这也是MP中批处理插入的核心逻辑。可以看出,MP首先切成数据(默认的碎片大小为1000)。碎片完成后,也是插入的一部分。如果您继续查看ExecuteBatch方法,您会发现这里的SQLSession实际上是一批SQLSession,而不是普通的SQLSession。

  总之,MP中的批处理插入方案实际上与我们2.1部分的批处理插入相同。

  好吧,经过上述分析,现在朋友知道该怎么办?

  兄弟歌曲提供了测试用例,公共帐户背景对批处理插入测试做出了响应,以获取案例地址。该情况有三种单位测试方法。您可以看到批处理插入之间的时差(数据库脚本在资源目录中)。

  有兴趣的朋友可能希望尝试?

  最后,再次感谢您的意见?