1. insert优化
1.1 批量插入
我们之前插入数据都是一条一条插入的,会导致频繁操作数据库,从而影响性能。比如遍历某个集合,然后逐个使用insert语句插入数据库表中
INSERT INTO table (name, age) VALUES ('张三', 18);
INSERT INTO table (name, age) VALUES ('李四', 19);
INSERT INTO table (name, age) VALUES ('王五', 20);
解决方案:可以使用批量插入,即一条insert语句插入多条数据(逗号分割的方式)
INSERT INTO table (name, age) VALUES ('张三', 18), ('李四', 19), ('王五', 20);
注意事件:
- 插入的数据不建议超过1000条;
- 如果插入大量数据,可以将数据分成多个批次进行插入,每个批次插入一定数量的数据。
1.2 手动提交事务
MySQL默认自动提交事务。
手动提交事务好处:将多个 INSERT 操作放在一个事务中执行,可以提供更好的性能和数据一致性。事务会把多个 INSERT 操作合并为一个原子操作,减少了磁盘 I/O 和日志刷新的开销。
# 执行insert语句之前开启事务
start transaction;
# 插入数据
INSERT INTO table (name, age) VALUES ('张三', 18);
INSERT INTO table (name, age) VALUES ('李四', 19);
INSERT INTO table (name, age) VALUES ('王五', 20);
# insert语句都执行完毕后,统一提交事务
commit;
1.3 大批量插入数据
如果一次性需要插入大批量数据,使用insert语句插入性能就比较较低了,我们可以使用MySQL数据库提供的load指令进行插入。
使用load指令操作如下:
-- 客户端连接服务端时,加上参数 -–local-infile
mysql –-local-infile -u root -p123456
-- 设置全局参数local_infile为1,表示开启从本地加载文件到数据库表结构中
set global local_infile = 1;
-- 执行load指令将准备好的数据,加载到表结构中
load data local infile '/root/sql1.cvs' into table tb_user fields terminated by ',' lines terminated by '\n' ;
load指令参数详解:
load data local infile
:加载本地文件/root/sql1.cvs
:表示磁盘文件into table tb_user
:导入到指定的数据库表结构中fields terminated by ','
:表示每个字段使用逗号分隔lines terminated by '\n'
:每一行数据使用\n分隔
注意:使用load指令大批量插入数据的时候,也要按照主键的顺序进行插入,因为主键顺序插入性能高于乱序插入。