脚本宝典收集整理的这篇文章主要介绍了php – 将大型CSV文件导入MySQL,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
csv文件的列数多于我当前导入的列数.是否更容易导入所有列?
我正在阅读LOAD DATA INFILE(http://dev.MysqL.COM/doc/refman/5.1/en/load-data.htML),但我想知道如何使用它并散列id并格式化日期没有逐行执行.我当前的脚本占用时间太长,导致运行时出现站点性能问题.
这是我有的:
$url = 'http://www.example.com/directory/file.csv'; if (($handle = foPEn($url,"r")) !== FALSE) { fgetcsv($handle,1000,","); while (($data = fgetcsv($handle,")) !== FALSE) { $EvID = $data[0]; $Ev = $data[1]; $PerID = $data[2]; $Per = $data[3]; $VName = $data[4]; $VID = $data[5]; $VSA = $data[6]; $DateTime = $data[7]; $PCatID = $data[8]; $PCat = $data[9]; $CCatID = $data[10]; $CCat = $data[11]; $GCatID = $data[12]; $GCat = $data[13]; $CITy = $data[14]; $state = $data[15]; $StateiD = $data[16]; $Country = $data[17]; $CountryID = $data[18]; $Zip = $data[19]; $TYN = $data[20]; $IMAGEURL = $data[21]; $URLLink = $data[22]; $data[7] = strtotime($data[7]); $data[7] = date("Y-m-d H:i:s",$data[7]); if((($PCatID == '2') && (($CountryID == '217') or ($CountryID == '38'))) || (($GCatID == '16') or ($GCatID == '19') or ($GCatID == '30') or ($GCatID == '32'))) { if(!MysqL_query("INSERT IGNORE INTO TNDB_CSV2 (id,EvID,Event,PerID,Per,VName,VID,VSA,DateTime,PCatID,PCat,CCatID,CCat,GCatID,GCat,City,State,StateID,Country,CountryID,Zip,TYN,IMAGEURL) VALUES ('".md5($EventID.$PerformerID)."','".addslashes($data[0])."','".addslashes($data[1])."','".addslashes($data[2])."','".addslashes($data[3])."','".addslashes($data[4])."','".addslashes($data[5])."','".addslashes($data[6])."','".addslashes($data[7])."','".addslashes($data[8])."','".addslashes($data[9])."','".addslashes($data[10])."','".addslashes($data[11])."','".addslashes($data[12])."','".addslashes($data[13])."','".addslashes($data[14])."','".addslashes($data[15])."','".addslashes($data[16])."','".addslashes($data[17])."','".addslashes($data[18])."','".addslashes($data[19])."','".addslashes($data[20])."','".addslashes($data[21])."')")) { exit("<br>" . MysqL_error()); } } } fclose($handle); }
任何帮助总是非常感谢.提前致谢.
尝试类似的东西(显然未经测试并在SO文本框中编码,检查括号与e.c.t匹配):
$url = 'http://www.example.com/directory/file.csv'; if (($handle = fopen($url,"); $imports = array(); while (($data = fgetcsv($handle,$data[7]); if((($PCatID == '2') && (($CountryID == '217') or ($CountryID == '38'))) || (($GCatID == '16') or ($GCatID == '19') or ($GCatID == '30') or ($GCatID == '32'))) { $imports[] = "('".md5($EventID.$PerformerID)."','".addslashes($data[21])."')"; } } $importarrays = array_chunk($imports,100); foreach($importarrays as $arr) { if(!MysqL_query("INSERT IGNORE INTO TNDB_CSV2 (id,IMAGEURL) VALUES ".implode(',',$arr)){ die("error: ".MysqL_error()); } } fclose($handle); }
使用array_chunk中的数字,太大,可能会导致查询太长等问题(是的,my.cnf中存在可配置的限制),太小而且不必要的开销.
你也可以放弃使用$data [x]给变量,因为它是一个浪费,因为脚本有多小,只需在你的查询e.c.t中直接使用$data [x]. (不会给出很大的改进,但根据你的进口大小,它可以节省一点).
接下来将使用低优先级插入/更新,请查看此信息以获取更多信息,以帮助您入门:How to give priority to certain queries?
毕竟,你可以想到MysqL配置优化,但这是一个谷歌解释真的,因为最好的设置是不同的每个人和他们独特的情况
编辑:我之前做过的另一件事是,如果您设置了很多导入不需要的密钥,您可以暂时删除这些密钥,并在脚本完成后将其添加回来.这也可以带来很好的时间改进,但是当你在一个实时数据库上工作时,如果沿着这条路走下去,就会有一些陷阱.
以上是脚本宝典为你收集整理的php – 将大型CSV文件导入MySQL全部内容,希望文章能够帮你解决php – 将大型CSV文件导入MySQL所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。