发布于:2020-05-30 22:05:53
备注:大数据量指单文本(含office相关文档docx,xlsx)10W+的导入导出。
MySQL有两种非常常用的表类型MyISAM和InnoDB。网上针对这两种表类型的介绍和比较非常多,其中主要的区别就是InnoDB支持事务和行级锁,但MyISAM不支持。MyISAM相对来讲效率比较高,二者各有优劣。
http://www.cnblogs.com/zlcxbb/p/5757173.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在当前的场景下是不错的选择。
http://www.jb51.net/article/51975.htm
当PHP需要插入大量数据的时候,当一条一条的插入时,会发现IO耗时严重拖性能。
Demo代码:
$params = array (‘value '=>' 50′); |
for ( $i =0; $i <2000000; $i ++){ |
$connect_mysql ->insert( $params ); |
有两种方法可以解决这种问题:
1. 使用事务(InnoDB支持)
比如可以每隔10000或者10000条提交一次事务,这样大大降低了IO
$connect_mysql ->query(‘BEGIN'); |
$params = array (‘value '=>' 50′); |
for ( $i =0; $i <2000000; $i ++){ |
$connect_mysql ->insert( $params ); |
$connect_mysql ->query(‘COMMIT'); |
$connect_mysql ->query(‘BEGIN'); |
$connect_mysql ->query(‘COMMIT'); |
2. 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 = substr ( $sql ,0, strlen ( $sql )-1); |
$connect_mysql ->query( $sql ); |
第一种方法较为常用,第二种方法多用于测试数据。
一般默认情况下,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-1195.html
https://my.oschina.net/u/1470240/blog/1934447
阅读 168+
10