MySQL中实现大数据量的快速插入

一、SQL语句优化

1. ​批量插入代替单条插入
  • 单条插入会频繁触发事务提交和日志写入,效率极低。
  • 批量插入通过合并多条数据为一条SQL语句,减少网络传输和SQL解析开销。
-- 低效写法:逐条插入
INSERT INTO table (col1, col2) VALUES (1, 'a');
INSERT INTO table (col1, col2) VALUES (2, 'b');-- 高效写法:批量插入
INSERT INTO table (col1, col2) VALUES 
(1, 'a'), (2, 'b'), (3, 'c'), ...;
  • 建议单次插入数据量​:控制在 500~2000 行(避免超出 max_allowed_packet)。
2. ​禁用自动提交(Autocommit)​
  • 默认情况下,每条插入都会自动提交事务,导致频繁的磁盘I/O。
  • 手动控制事务,将多个插入操作合并为一个事务提交:
START TRANSACTION;
INSERT INTO table ...;
INSERT INTO table ...;
...
COMMIT;
  • 注意​:事务过大可能导致 undo log 膨胀,需根据内存调整事务批次(如每 1万~10万 行提交一次)。
3. ​**使用 LOAD DATA INFILE**​
  • 从文件直接导入数据,比 INSERT 快 ​20倍以上,跳过了SQL解析和事务开销。
LOAD DATA LOCAL INFILE '/path/data.csv' 
INTO TABLE table
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';
  • 适用场景​:从CSV或文本文件导入数据。
4. ​禁用索引和约束
  • 插入前禁用索引(尤其是唯一索引和全文索引),插入完成后重建:
-- 禁用索引
ALTER TABLE table DISABLE KEYS;
-- 插入数据...
-- 重建索引
ALTER TABLE table ENABLE KEYS;
  • 禁用外键检查​:
SET FOREIGN_KEY_CHECKS = 0;
-- 插入数据...
SET FOREIGN_KEY_CHECKS = 1;

二、参数配置优化

1. ​InnoDB引擎参数调整
  • ​**innodb_flush_log_at_trx_commit**​:
    • 默认值为 1(每次事务提交都刷盘),改为 0 或 2 可减少磁盘I/O。
    • 0:每秒刷盘(可能丢失1秒数据)。
    • 2:提交时写入OS缓存,不强制刷盘。
  • ​**innodb_buffer_pool_size**​:
    • 增大缓冲池大小(通常设为物理内存的 70%~80%),提高数据缓存命中率。
  • ​**innodb_autoinc_lock_mode**​:
    • 设为 2(交叉模式),减少自增锁竞争(需MySQL 8.0+)。
2. ​调整网络和包大小
  • ​**max_allowed_packet**​:
    • 增大允许的数据包大小(默认 4MB),避免批量插入被截断。
  • ​**bulk_insert_buffer_size**​:
    • 增大批量插入缓冲区大小(默认 8MB)。
3. ​其他参数
  • ​**back_log**​:增大连接队列长度,应对高并发插入。
  • ​**innodb_doublewrite**​:关闭双写机制(牺牲数据安全换取性能)。

三、存储引擎选择

1. ​MyISAM引擎
  • 优点​:插入速度比InnoDB快(无事务和行级锁开销)。
  • 缺点​:不支持事务和崩溃恢复,适合只读或允许数据丢失的场景。
2. ​InnoDB引擎
  • 优点​:支持事务和行级锁,适合高并发写入。
  • 优化技巧​:
    • 使用 innodb_file_per_table 避免表空间碎片。
    • 主键使用自增整数(避免随机写入导致的页分裂)。

四、硬件和架构优化

1. ​使用SSD硬盘
  • 替换机械硬盘为SSD,提升I/O吞吐量。
2. ​分库分表
  • 将单表拆分为多个子表(如按时间或ID范围),减少单表压力。
  • 使用中间件(如ShardingSphere)或分区表(PARTITION BY)。
3. ​读写分离
  • 主库负责写入,从库负责查询,降低主库压力。
4. ​异步写入
  • 将数据先写入消息队列(如Kafka),再由消费者批量插入数据库。

五、代码层面优化

1. ​多线程并行插入
  • 将数据分片,通过多线程并发插入不同分片。
  • 注意​:需确保线程间无主键冲突。
2. ​预处理语句(Prepared Statements)​
  • 复用SQL模板,减少解析开销:
// Java示例
String sql = "INSERT INTO table (col1, col2) VALUES (?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
for (Data data : list) {ps.setInt(1, data.getCol1());ps.setString(2, data.getCol2());ps.addBatch();
}
ps.executeBatch();

六、性能对比示例

优化方法插入10万条耗时(秒)
逐条插入(默认)120
批量插入(1000行/次)5
LOAD DATA INFILE1.5

总结

  • 核心思路​:减少磁盘I/O、降低锁竞争、合并操作。
  • 推荐步骤​:
    1. 优先使用 LOAD DATA INFILE 或批量插入。
    2. 调整事务提交策略和InnoDB参数。
    3. 优化表结构(禁用非必要索引)。
    4. 根据硬件和场景选择存储引擎。
    5. 在架构层面分库分表或异步写入。

通过上述方法,可在MySQL中实现每秒数万甚至数十万条的高效插入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/81904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++23中std::span和std::basic_string_view可平凡复制提案解析

文章目录 一、引言二、相关概念解释2.1 平凡复制(Trivially Copyable)2.2 std::span2.3 std::basic_string_view 三、std::span和std::basic_string_view的应用场景3.1 std::span的应用场景3.2 std::basic_string_view的应用场景 四、P2251R1提案对std::…

广东省省考备考(第十八天5.23)—言语:语句填空题(听课后强化训练)

错题 解析 横线出现在文段中间,需结合上下文内容进行分析。文段开篇指出逃离北上广深的话题时而出现,一些人离开大城市回到小城市。随后通过转折词“但”引出横线内容,且结合横线后人才倾向于向更发达的地方流动的内容,横线处应体…

持续更新 ,GPT-4o 风格提示词案例大全!附使用方式

本文汇集了各类4o风格提示词的精选案例,从基础指令到复杂任务,从创意写作到专业领域,为您提供全方位的参考和灵感。我们将持续更新这份案例集,确保您始终能够获取最新、最有效的提示词技巧。 让我们一起探索如何通过精心设计的提…

创建型:建造者模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 工作流程 2.3 实现案例 2.4 变体:链式建造者(常见于多参数对象,无需指挥者) 3、优缺点分析 4、适用场景 1、核心思想 目的:将复杂对象的构建过程与其表示分离…

力扣-长度最小的子数组

1.题目描述 2.题目链接 LCR 008. 长度最小的子数组 - 力扣(LeetCode) 3.题目分析 这道题目我们使用的也是双指针。我们可以定义两个指针都指向数组第一个元素,然后使用right指针遍历原数组,计算left指针到right指针之间的所有元…

JAVA开发工具延长方案

亲测稳定的延长方案与避坑指南 真的搞不懂了,说点专业的术语竟然成了 QINQUAN。那就直接点,把这个方案带给需要的开发者。 延长工具直通车 保姆级教程 延长方案https://mp.weixin.qq.com/s/uajM2Y9Vz6TnolzcLur_bw还是让大家看看,发什么会被…

SpringAI开发SSE传输协议的MCP Server

SpringAI 访问地址:Spring AI ‌ Spring AI‌是一个面向人工智能工程的应用框架,由Spring团队推出,旨在将AI能力集成到Java应用中。Spring AI的核心是解决AI集成的根本挑战,即将企业数据和API与AI模型连接起来‌。 MCP…

JAVA动态生成类

在java的加载过程一般都是要预先定义java类,然后通过经过加载->连接->初始化三步。连接过程又可分为三步:验证->准备->解析。初始化的类是不允许修改。但是在日常的工作中有时候需要动态生成类,那第这种情况怎么办呢? 可以这么处理: 1、先定义一个空的类,仅…

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践 引言 随着云计算和分布式系统的快速发展,微服务架构已成为现代软件开发的主流模式。Java作为企业级应用开发的核心语言,结合Spring Boot和Spring Cloud,为开发者提…

03_基础篇-NumPy(下):深度学习中的常用操作

03_基础篇-NumPy(下):深度学习中的常用操作 通过上节课的学习,我们已经对NumPy数组有了一定的了解,正所谓实践出真知,今天我们就以一个图像分类的项目为例,看看NumPy的在实际项目中都有哪些重要…

时钟识别项目报告(深度学习、计算机视觉)

深度学习方式 一、模型架构 本模型采用双任务学习框架,基于经典残差网络实现时钟图像的小时和分钟同步识别。 主干网络 使用预训练的ResNet18作为特征提取器,移除原分类层(fc层),保留全局平均池化后的512维特征向量。…

openai-whisper-asr-webservice接入dify

openai-whisper-asr-webservice提供的asr的api其实并不兼容openai的api,所以在dify中是不能直接添加到语音转文字的模型中,对比了下两个api的传参情况,其实只要改动一处,就能支持: openai兼容的asr调用中formdata中音频…

解锁MySQL性能调优:高级SQL技巧实战指南

高级SQL技巧:解锁MySQL性能调优的终极指南 开篇 当前,随着业务系统的复杂化和数据量的爆炸式增长,数据库性能调优成为了技术人员面临的核心挑战之一。尤其是在高并发、大数据量的场景下,SQL 查询的性能直接影响到整个系统的响应…

JavaScript 性能优化实战指南

JavaScript 性能优化实战指南 前言 随着前端应用复杂度提升,JavaScript 性能瓶颈日益突出。高效的性能优化不仅能提升用户体验,还能增强系统稳定性和可维护性。本文系统梳理了 JavaScript 性能优化的核心思路、常见场景和实战案例,结合代码…

服务器磁盘按阵列划分为哪几类

以下是服务器磁盘阵列(RAID)的详细分类及技术解析,基于现行行业标准与实践应用: 一、主流RAID级别分类 1. ‌RAID 0(条带化)‌ ‌技术原理‌:数据分块后并行写入多块磁盘,无…

鸿蒙 Location Kit(位置服务)

移动终端设备已经深入人们日常生活的方方面面,如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动,都离不开定位用户终端设备的位置。 Location Kit 使用多种定位技术提供服务,可以准确地确定设备在室外/室…

二叉树深搜:在算法森林中寻找路径

专栏:算法的魔法世界 个人主页:手握风云 目录 一、搜索算法 二、回溯算法 三、例题讲解 3.1. 计算布尔二叉树的值 3.2. 求根节点到叶节点数字之和 3.3. 二叉树剪枝 3.4. 验证二叉搜索树 3.5. 二叉搜索树中第 K 小的元素 3.6. 二叉树的所有路径 …

企业级AI搜索解决方案:阿里云AI搜索开放平台

随着信息技术的飞速发展,搜索引擎作为信息获取的重要工具,扮演着不可或缺的角色。阿里云 AI 搜索开放平台以其强大的技术支持和灵活的开放性,持续为用户提供高效的搜索解决方案。 一、阿里云 AI 搜索开放平台 一站式的 AI 搜索开放平台作为…

自动驾驶中的预测控制算法:用 Python 让无人车更智能

自动驾驶中的预测控制算法:用 Python 让无人车更智能 自动驾驶技术近年来取得了令人惊叹的进步,AI 与边缘计算的结合让车辆能够实时感知环境、规划路径并执行驾驶决策。其中,预测控制(Model Predictive Control,MPC) 作为一种先进的控制算法,凭借其对未来驾驶行为的优化…

量子计算机超越超级计算机——它们解决了哪些问题?

“ 南加州大学的研究人员取得了重大突破,证明量子计算机在解决某些复杂问题时甚至可以胜过最快的超级计算机。” 量子退火最终显示出扩展优势,得益于错误抑制的量子处理,它比传统超级计算机提供更快、接近最优的解决方案。 南加州大学的研究人…