ThinkPHP PHP MySQL大数据量导入导出
2018-08-27 10:41
701 查看
参考链接:http://blog.coinidea.com/web%E5%BC%80%E5%8F%91/php-1195.html
备注:大数据量指单文本(含office相关文档docx,xlsx)10W+的导入导出。
MySQL有两种非常常用的表类型MyISAM和InnoDB。网上针对这两种表类型的介绍和比较非常多,其中主要的区别就是InnoDB支持事务和行级锁,但MyISAM不支持。MyISAM相对来讲效率比较高,二者各有优劣。
/detail/2681816420.html:
MyISAM 和 InnoDB的适用场景
MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
MyISAM 和 InnoDB的区别
1)MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持
2)mysiam表不支持外键
3)在执行数据库写入的操作(insert,update,delete)的时候,mysiam表会锁表,而innodb表会锁行
4)当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。因为mysiam表的查询操作效率和速度都比innodb要快
综上,InnoDB在当前的场景下是不错的选择。
/detail/2615748948.html
当PHP需要插入大量数据的时候,当一条一条的插入时,会发现IO耗时严重拖性能。
Demo代码:
有两种方法可以解决这种问题:
使用事务(InnoDB支持)
比如可以每隔10000或者10000条提交一次事务,这样大大降低了IO
SQL语句拼接
这是MySQL的一种特性,使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入,如果字符串太长,则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet = 210241024*10;
第一种方法较为常用,第二种方法多用于测试数据。
一般默认情况下,PHP的内存为128MB,当使用ThinkPHP超内存的时候,可以调高PHP的默认最大内存,也可以将只需要在入口文件中删除常量APP_DEBUG的定义或者定义为false。这个时候会很省很多内存。当然也可以使用事务模式每隔n条提交一次。
当然一次性提交也可以用ThinkPHP的addAll函数,不过该函数Bug较多。
ThinkPHP开启和提交事务
当如果需要操作Office相关文件的时候推荐使用PHPWord和PHPExcel。
参考链接:http://blog.coinidea.com/web%E5%BC%80%E5%8F%91/php-1195.html
备注:大数据量指单文本(含office相关文档docx,xlsx)10W+的导入导出。
MySQL有两种非常常用的表类型MyISAM和InnoDB。网上针对这两种表类型的介绍和比较非常多,其中主要的区别就是InnoDB支持事务和行级锁,但MyISAM不支持。MyISAM相对来讲效率比较高,二者各有优劣。
/detail/2681816420.html:
MyISAM 和 InnoDB的适用场景
MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
MyISAM 和 InnoDB的区别
1)MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持
2)mysiam表不支持外键
3)在执行数据库写入的操作(insert,update,delete)的时候,mysiam表会锁表,而innodb表会锁行
4)当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。因为mysiam表的查询操作效率和速度都比innodb要快
综上,InnoDB在当前的场景下是不错的选择。
/detail/2615748948.html
当PHP需要插入大量数据的时候,当一条一条的插入时,会发现IO耗时严重拖性能。
Demo代码:
$params = array(‘value'=>'50′); set_time_limit(0); echo date(“H:i:s”); for($i=0;$i<2000000;$i++){ $connect_mysql->insert($params); }; echo date(“H:i:s”);
有两种方法可以解决这种问题:
使用事务(InnoDB支持)
比如可以每隔10000或者10000条提交一次事务,这样大大降低了IO
echo date(“H:i:s”); $connect_mysql->query(‘BEGIN'); $params = array(‘value'=>'50′); for($i=0;$i<2000000;$i++){ $connect_mysql->insert($params); if($i%100000==0){ $connect_mysql->query(‘COMMIT'); $connect_mysql->query(‘BEGIN'); } } $connect_mysql->query(‘COMMIT'); echo date(“H:i:s”);
SQL语句拼接
这是MySQL的一种特性,使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入,如果字符串太长,则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet = 210241024*10;
$sql= “insert into twenty_million (value) values”; for($i=0;$i<2000000;$i++){ $sql.=”('50′),”; }; $sql = substr($sql,0,strlen($sql)-1); $connect_mysql->query($sql);
第一种方法较为常用,第二种方法多用于测试数据。
一般默认情况下,PHP的内存为128MB,当使用ThinkPHP超内存的时候,可以调高PHP的默认最大内存,也可以将只需要在入口文件中删除常量APP_DEBUG的定义或者定义为false。这个时候会很省很多内存。当然也可以使用事务模式每隔n条提交一次。
当然一次性提交也可以用ThinkPHP的addAll函数,不过该函数Bug较多。
ThinkPHP开启和提交事务
$table->startTrans(); $table->commit();
当如果需要操作Office相关文件的时候推荐使用PHPWord和PHPExcel。
参考链接:http://blog.coinidea.com/web%E5%BC%80%E5%8F%91/php-1195.html
相关文章推荐
- thinkphp5 phpexcel导出导入
- PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/classname
- MySQL大数据量的导入与导出
- PHP将Excel表中的数据导入导出mysql
- ThinkPHP+PHPExcel[导入][导出]实现方法
- PHP导入导出mysql为sql文件的方法(已经验证,有实例,很好用)
- ThinkPHP3.2+PHPExcel1.8版类库 实现导入导出excel表
- php mysql数据的导入导出,数据表结构的导入导出
- ThinkPHP 3.2 PHPExcel 导入导出文件 第三方类库不能用问题解决
- ThinkPHP 3.2 + PHPExcel 导入导出文件 第三方类库不能用问题解决
- MySQL大数据量的导入与导出
- phpexcle在thinkphp3.2.3下的导入导出数据
- ThinkPHP 3.2 + PHPExcel 导入导出文件 第三方类库不能用问题解决
- php 导出 xls,csv 的方法,csv导入mysql
- thinkphp 导出Excel文档,导入Excel文档;PHPExcel的使用
- ThinkPHP+PHPExcel[导入][导出]实现方法
- 用php导入10W条+ 级别的csv大文件数据到mysql。导出10W+级别数据到csv文件
- phpexcel使用说明5----ThinkPHP+PHPExcel[导入][导出]实现方法
- 用php导入10W条+ 级别的csv大文件数据到mysql。导出10W+级别数据到csv文件
- ThinkPHP+PHPExcel[导入][导出]实现方法