在MySQL中,数据插入性能主要受三个因素影响:索引维护、唯一性校验和数据体积。针对不同场景,可采用以下优化策略:
一、 针对 MyISAM 引擎的表:
1. 禁用索引
在向非空表批量插入数据时,MySQL需要维护索引结构并对插入记录进行排序,这会显著降低写入性能。为优化此场景,可采用索引禁用策略:在数据插入前暂时禁用索引,待数据导入完成后重新启用索引。对于新创建的表,建议先导入数据再创建索引。这种后置索引策略将索引构建从逐行维护转为批量操作,可显著提升数据导入效率。
如果我们需要对dotcpp_user用户表进行数据插入,我们可以先禁用索引:
ALTER TABLE dotcpp_user DISABLE KEYS;
插入完成后,我们再开启索引:
ALTER TABLE dotcpp_user ENABLE KEYS;
2. 禁用唯一性检查
插入数据时,MySQL的唯一性校验会降低写入性能。为提升批量插入效率,可临时禁用唯一性检查,待数据导入完成后重新启用。
SET UNIQUE_CHECKS=0;--禁用唯一性检查 SET UNIQUE_CHECKS=1;--开启唯一性检查
3. 使用批量插入
在MySQL中,插入多条数据可采用单语句批量插入或多语句逐条插入两种方式。
3.1 使用 INSERT 语句插入多条数据:
INSERT INTO dotcpp_user(name, age, gender, grades, comment) VALUES ('dotcpp_user01',18,'男',100,'高精度'), ('dotcpp_user02',18,'男',100,'汉诺塔');
3.2单个 INSERT 语句只插入1条数据,执行多个 INSERT 语句:
INSERT INTO dotcpp_user(name, age, gender, grades, comment) VALUES('dotcpp_user01',18,'男',100,'高精度');
INSERT INTO dotcpp_user(name, age, gender, grades, comment) VALUES('dotcpp_user02',18,'男',100,'汉诺塔');
在MySQL数据插入操作中,批量插入性能显著优于逐条插入。单条INSERT语句配合多值列表的批量插入方式通过减少数据库连接和通信开销,可大幅提升数据写入效率。对于大规模数据导入,应优先采用LOAD DATA INFILE语句,其数据加载速度较INSERT语句有数量级提升,是最高效的数据批量导入方案。
二、 针对 InnoDB 引擎的表:
1. 禁用唯一性检查
同 MyISAM 引擎相同,插入数据之前先禁用索引,等到数据都插入完毕后在开启索引。
2. 禁用外键检查
外键约束会引入主键验证和记录锁定机制,增加子表插入操作的开销。为提高批量插入性能,可临时禁用外键检查,但此举会暂时破坏参照完整性,故在数据一致性要求严格的系统中应避免使用。该优化适用于可确保数据内在完整性且对性能有较高要求的场景。
SET FOREIGN_KEY_CHECKS=0;--禁用外键检查语句 SET FOREIGN_KEY_CHECKS=1;--恢复外键检查语句
2. 禁止自动提交
MySQL 的事务自动提交模式默认是开启的,其对 MySQL 的性能也有一定得影响。也就是说如果你插入了 100 条数据,MySQL 就会提交 100 次,这大大影响了插入数据的速度。而如果我们把自动提交关掉,通过程序来控制,只要一次提交就可以了。所以插入数据之前可以先禁止事务的自动提交,待数据导入完成之后,再恢复自动提交操作。
SET AUTOCOMMIT=0;--禁止自动提交语句 SET AUTOCOMMIT=1;;--恢复自动提交语句
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程