当前位置: 当前位置:首页 >人工智能 >MySQL怎么快速插入1亿条数据 正文

MySQL怎么快速插入1亿条数据

2025-11-05 11:49:35 来源:多维IT资讯作者:IT科技类资讯 点击:974次

哈喽,速插大家好,入亿MySQL作为广泛使用的条数开源关系型数据库管理系统,应该没有Java开发没使用过吧。速插

关于MySQL,入亿我们大部分时间都在聊,条数如何提高查询效率,速插今天我们来聊聊如何提高MySQL的入亿插入效率。

提高插入效率的条数方式

一般情况下,数据库是速插运行在专门的服务器上,提高插入效率最明显的入亿当然是提高服务器配置啦。 

比如,条数使用高性能的速插CPU和SSD磁盘,使用分布式系统架构,入亿将写入压力分散到多个节点。条数这个方式的成本也是最高的,老板们当然不会使用这种方式了。

我们还可以从其他方面入手:

调整数据库配置:优化缓冲池大小、增大批量插入缓冲区等,通过调整MySQL数据库参数的方式。选择使用MyISAM存储引擎,因为其简单的IT技术网表锁机制和无事务开销而在插入速度上表现更优。使用批量插入的方式。

考虑到实际的应用场景,我们最可能操作的就是使用第3种实现方式,通过批量插入的方式来提高效率。

探索批量插入

常用的批量插入的方式有2种:

拼接SQL,使用 insert into xxx (...) values (...),(...),(...)利用事务,将批量插入操作封装在单个事务中,可以减少事务开销并提高并发性能。

在mybatisPlus,以及mybatis-flex中,saveBatch 就是使用的这种方式

接下来我们来测试一下这几个方法。

测试代码

测试的SQL

复制CREATE TABLE `orders` ( `order_id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 订单ID(主键), `customer_id` BIGINT NOT NULL COMMENT 客户ID(关联customer表), `order_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT 订单状态 1-待支付 2-已支付 3-待发货 4-已发货 5-已完成 6-已取消, `payment_method` tinyint(4) NULL DEFAULT null COMMENT 支付方式; 1-现金 2-支付宝 3-微信 4-银行卡, `total_amount` DECIMAL(10, 2) NOT NULL COMMENT 订单总金额, `shipping_fee` DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT 运费, `coupon_discount` DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT 优惠券减免金额, `order_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 下单日期, `payment_time` DATETIME DEFAULT NULL COMMENT 支付时间, `shipping_address` VARCHAR(255) NULL COMMENT 收货地址, `receiver_name` VARCHAR(50) NULL COMMENT 收货人姓名, `receiver_phone` VARCHAR(20) NULL COMMENT 收货人电话, PRIMARY KEY (`order_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT =订单信息表;1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.

一、使用 batchXml

复制insert into orders (order_id, customer_id, order_status, payment_method, order_date, total_amount, shipping_fee, coupon_discount) values <foreach collection="orders" item="item" separator=","> (#{item.orderId}, #{item.customerId}, #{item.orderStatus}, #{item.paymentMethod}, #{item.orderDate}, #{item.totalAmount}, #{item.shippingFee}, #{item.couponDiscount}) </foreach>1.2.3.4.5.

二、使用mybatis-flex提供的saveBatch

复制ordersService.saveBatch(list);1.

三、手动控制事务的提交,saveBatchSession

复制public void saveBatchSession(List<Orders> orders) { SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); OrdersMapper mapper = session.getMapper(OrdersMapper.class); for (int i = 0,length = orders.size(); i < length; i++) { mapper.insert(orders.get(i)); } session.commit(); session.clearCache(); session.close(); }1.2.3.4.5.6.7.8.9.10.

启动代码

复制@Test public void generatorTestData() { genOrders(0L, 100000L); } private void genOrders(long start, long end) { List<Orders> list = new ArrayList<>(); long s = System.currentTimeMillis(); for (long i = start + 1; i <= end; i++) { if ((i - start) % 1000 == 0) { ordersService.saveBatchSession(list); // ordersService.saveBatchXml(list); // ordersService.saveBatch(list); list.clear(); itemAll.clear(); System.out.println("生成数据:" + (i - start) + "条,耗时:" + (System.currentTimeMillis() - s) + "ms"); s = System.currentTimeMillis(); continue; } // 构建所有属性 list.add(Orders.builder() ... .build()); } ordersService.saveBatch(list); }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.

测试结果

使用了3种方式进行测试

未开启批处理,batchXml

图片

未开启批处理,mybatis-flex提供的saveBatch

图片

未开启批处理,免费信息发布网saveBatchSession

图片

从这里的结果可以看出,使用 batchXml 的效率是最高的,远远超越其他方式。但是仔细一想,这些数据应该很不正常,插入1000条数据,竟然需要4秒左右,和单条插入1000次的时间几乎没有区别。

开启批处理

经过一番查询资料,并检查配置,发现果然另有玄机,连接数据库的时候没有开启批处理

开启方式:在spring的配置文件中,连接数据源时,url需要增加 allowPublicKeyRetrieval=true

然后重新测试一遍。

开启批处理,saveBatchXml

图片

开启批处理,mybatis-flex提供的saveBatch

图片

开启批处理,saveBatchSession

图片

这次的结果就比较正常了,可以看出来:

saveBatchSession最快mybatis-flex提供的saveBatch 因为有些额外的操作,多消耗了10ms左右的时间saveBatchXml 相较于另外两种方式,服务器托管慢了30ms~40ms。

接下来,把每批次的处理数据由1000次增加到10000次,再次进行测试。

开启批处理,saveBatchXml,10000条一批次

图片

开启批处理,saveBatchSession,10000条一批次

图片

开启批处理,mybatis-flex提供的saveBatch,10000条一批次

图片

由此结果可以看出来:

saveBatchSession和mybatis-flex提供的saveBatch 耗时基本一致saveBatchXml就明显的慢一些,按照效率差算,差了将近50%的效率

总结

综上,提高MySQL插入效率主要可通过调整数据库配置、选择适合的存储引擎以及运用批量插入策略等方式实现。在实际应用中,尤其是在使用ORM框架进行数据操作时,应合理选择并充分利用批量插入功能,以最大程度提升插入效率。

作者:IT科技
------分隔线----------------------------
头条新闻
图片新闻
新闻排行榜