MySQL大批量数据插入,PHP之for不断插入时出现缓慢的解决方案及优化(转载)

本文通过对比测试展示了在MySQL中使用单条INSERT语句插入多条记录的方法来大幅提升批量插入性能,特别是在使用MyISAM存储引擎时效果更佳。
 公司有一个项目,需要频繁的插入数据到MySQL数据库中,设计目标要求能支持平均每秒插入1000条数据以上。目前功能已经实现,不过一做压力测试,发现数据库成为瓶颈,每秒仅能插入100多条数据,远远达不到设计目标。 

     到MySQL官方网站查了查资料,发现MySQL支持在一条INSERT语句中插入多条记录,格式如下: 
INSERT table_name (column1, column2, ..., columnN) 
VALUES (rec1_val1, rec1_val2, ..., rec1_valN), 
(rec2_val1, rec2_val2, ..., rec2_valN), 
... ... 
(recM_val1, recM_val2, ..., recM_valN); 

  按MySQL官方网站,用这种方法一次插入多条数据,速度比一条一条插入要快很多。在一台开发用的笔记本电脑上做了个测试,果然速度惊人。 


  测试环境:DELL Latitude D630, CPU T7250 @ 2.00GHz, 内存 2G。Windows XP Pro中文版SP2,MySQL 5.0 for Windows。 

  MySQL是新安装的,建立了一个名为test的数据库,在test数据库建了一个t_integer表,共两个字段:test_id和test_value,两个字段都是INTEGER类型,其中test_id是Primary Key。 

  准备了两个SQL脚本文件(写了个小程序生成的),内容分别如下: 

复制代码
-- test1.sql 
TRUNCATE TABLE t_integer; 
INSERT t_integer (test_id, test_value) 
VALUES (1, 1234), 
(2, 1234), 
(3, 1234), 
(4, 1234), 
(5, 1234), 
(6, 1234), 
... ... 
(9997, 1234), 
(9998, 1234), 
(9999, 1234), 
(10000, 1234);
复制代码
复制代码
-- test2.sql 
TRUNCATE TABLE t_integer; 
INSERT t_integer (test_id, test_value) VALUES (1, 1234); 
INSERT t_integer (test_id, test_value) VALUES (2, 1234); 
INSERT t_integer (test_id, test_value) VALUES (3, 1234); 
INSERT t_integer (test_id, test_value) VALUES (4, 1234); 
INSERT t_integer (test_id, test_value) VALUES (5, 1234); 
INSERT t_integer (test_id, test_value) VALUES (6, 1234); 
... ... 
INSERT t_integer (test_id, test_value) VALUES (9997, 1234); 
INSERT t_integer (test_id, test_value) VALUES (9998, 1234); 
INSERT t_integer (test_id, test_value) VALUES (9999, 1234); 
INSERT t_integer (test_id, test_value) VALUES (10000, 1234); 
复制代码


  以上两个脚本通过mysql命令行运行,分别耗时0.44秒和136.14秒,相差达300倍。 

  基于这个思路,只要将需插入的数据进行合并处理,应该可以轻松达到每秒1000条的设计要求了。 

  补充:以上的测试都是在InnoDB表引擎基础上进行的,而且是AUTOCOMMIT=1,对比下来速度差异非常显著。之后我将t_integer表引擎设置为MyISAM进行测试,test1.sql执行时间为0.11秒,test2.sql为1.64秒。 

  补充2:以上的测试均为单机测试,之后做了跨机器的测试,测试客户端(运行脚本的机器)和服务器是不同机器,服务器是另一台笔记本,比单机测试时配置要好些。做跨机器的测试时,发现不管是InnoDB还是MyISAM,test1.sql速度都在0.4秒左右,而test2.sql在InnoDB时且AUTOCOMMIT=1时要80多秒,而设置为MyISAM时也要20多秒。 

  方法一:用PHP构造一次插入多条,并多次以for插入,像装车一样,一车一车的把sql运过去。 

<?php
for($i=0;$i<10;$i++){
mysql_query("insert into table_name (name,age) values ('name1','age1'),('name2','age2'); //一车:i=1,第二车:i=2
}
?>

  方法二:如果是网络和循环太慢,则建议用C来做这个事情,会提高三倍左右的速度,相对PHP可能会有相当的提升。 
  方法三:用队列来做,分多个进程实现,可能有一定程序的时间上提高,同时要注意binlog的影响及索引的影响。BY:Jack

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值