网站建设方案硬件支撑,网站建设公司宣传标语,互联网公司注册,微信怎么做链接推广产品MYSQL批量插入数据库实现语句性能分析
假定我们的表结构如下
代码如下 CREATE TABLE example ( example_id INT NOT NULL, name VARCHAR( 50 ) NOT NULL, value VARCHAR( 50 ) NOT NULL, other_value VARCHAR( 50 ) NOT NULL ) 通常情况下单条插入的sql语句我们会这么写
代码如下 INSERT INTO example (example_id, name, value, other_value) VALUES (100, Name 1, Value 1, Other 1); mysql允许我们在一条sql语句中批量插入数据如下sql语句
代码如下 INSERT INTO example (example_id, name, value, other_value) VALUES (100, Name 1, Value 1, Other 1), (101, Name 2, Value 2, Other 2), (102, Name 3, Value 3, Other 3), (103, Name 4, Value 4, Other 4); 如果我们插入列的顺序和表中列的顺序一致的话还可以省去列名的定义如下sql
代码如下 INSERT INTO example VALUES (100, Name 1, Value 1, Other 1), (101, Name 2, Value 2, Other 2), (102, Name 3, Value 3, Other 3), (103, Name 4, Value 4, Other 4); 上面看上去没什么问题下面我来使用sql语句优化的小技巧下面会分别进行测试目标是插入一个空的数据表200W条数据 第一种方法使用insert into 插入代码如下
代码如下 $params array(value50); set_time_limit(0); echo date(H:i:s); for($i0;$i2000000;$i){ $connect_mysql-insert($params); }; echo date(H:i:s); 最后显示为23:25:05 01:32:05 也就是花了2个小时多! 第二种方法使用事务提交批量插入数据库(每隔10W条提交下)最后显示消耗的时间为22:56:13 23:04:00 一共8分13秒 代码如下
代码如下 echo date(H:i:s); $connect_mysql-query(BEGIN); $params array(value50); for($i0;$i2000000;$i){ $connect_mysql-insert($params); if($i%1000000){ $connect_mysql-query(COMMIT); $connect_mysql-query(BEGIN); } } $connect_mysql-query(COMMIT); echo date(H:i:s); 第三种方法使用优化SQL语句将SQL语句进行拼接使用 insert into table () values (),(),(),()然后再一次性插入如果字符串太长 则需要配置下MYSQL在mysql 命令行中运行 set global max_allowed_packet 2*1024*1024*10;消耗时间为11:24:06 11:25:06; 插入200W条测试数据仅仅用了1分钟!代码如下
代码如下 $sql insert into twenty_million (value) values; for($i0;$i2000000;$i){ $sql.(50),; }; $sql substr($sql,0,strlen($sql)-1); $connect_mysql-query($sql); 最后总结下在插入大批量数据时第一种方法无疑是最差劲的而第二种方法在实际应用中就比较广泛第三种方法在插入测试数据或者其他低要求时比较合适速度确实快。