首先,可以定义1个1000万次的循环,每次循环插入1条数据,当1000万次循环全部执行结束,则插入完成!
也可以使用1条INSERT语句插入多条数据,例如:
INSERT INTO t_user (username, password, age, phone, email) VALUES ('user01', 'password01', 11, '13800138001', 'user01@qq.com'), ('user02', 'password02', 12, '13800138002', 'user02@qq.com'), ('user03', 'password03', 13, '13800138003', 'user03@qq.com'), ('user04', 'password04', 14, '13800138004', 'user04@qq.com'), ('user05', 'password05', 15, '13800138005', 'user05@qq.com'), ('user06', 'password06', 16, '13800138006', 'user06@qq.com'), ('user07', 'password07', 17, '13800138007', 'user07@qq.com'), ('user08', 'password08', 18, '13800138008', 'user08@qq.com'), ('user09', 'password09', 19, '13800138009', 'user09@qq.com'), ('user10', 'password10', 20, '13800138010', 'user10@qq.com'), ('user11', 'password11', 21, '13800138011', 'user11@qq.com'), ('user12', 'password12', 22, '13800138012', 'user12@qq.com'), ('user13', 'password13', 23, '13800138013', 'user13@qq.com'), ('user14', 'password14', 24, '13800138014', 'user14@qq.com'), ('user15', 'password15', 25, '13800138015', 'user15@qq.com'), ('user16', 'password16', 26, '13800138016', 'user16@qq.com'), ('user17', 'password17', 27, '13800138017', 'user17@qq.com'), ('user18', 'password18', 28, '13800138018', 'user18@qq.com'), ('user19', 'password19', 29, '13800138019', 'user19@qq.com'), ('user20', 'password20', 30, '13800138020', 'user20@qq.com');
所以,可以将1000万条数据尝试以上的拼接再来执行,但是,由于拼接过长的SQL语句字符串会导致拼接时的效率非常低,所以,不可以使用1个字符串拼出1次插入太多数据的!可行的解决方案可以是:例如使用1条SQL语句插入1000条数据,并且把这样的做法循环1万次,就可以解决这个问题!
另外,还可以通过批处理解决性能问题,其核心是一次性向MySQL发送多条SQL指令,但并不直接执行,而是当发送到一定数量或满足一次条件后,再由MySQL执行多条SQL指令。
由程序将SQL指令发送到MySQL,并执行,其执行效率存在的问题可能有:
-
程序可能是运行在应用服务器上的,例如运行在Tomcat服务器上,而MySQL可能是专门的服务器,即程序和MySQL并不在同一台服务器上,每次需要执行SQL指令时,首先需要建立与MySQL服务器的连接,才可以将SQL指令传送到MySQL服务器,甚至,即使使用的是同一台服务器,这个连接、传送的过程依然是存在的!通过批处理的做法可以进行优化,即:只用建立1次连接,就可以传送100甚至1000甚至更多条SQL语句,从而大大的减少连接次数!
-
当SQL指令送达MySQL服务器后,在执行之前,还必须经过编译、解释、词法分析、语义分析等过程,才可以被执行!所以,如果使用1条SQL语句插入10条数据,肯定比循环10次却每次插入1条数据的效率要高得多!
所以,如果是1000万次的循环,每次插入1条数据,问题就出在:需要建立1000万次连接MySQL的过程,并需要在执行之前检查1000万条SQL指令!
解决方案中的第1点肯定是使用批处理的做法,减少连接次数!第2点就是使用同1条SQL指令插入多条数据,则可以减少编译、分析的次数!所以,最终的解决方案可以是循环100次,每次都是1个批处理,每个批处理中发送100条SQL指令,每个SQL指令插入1000条数据。