php – 将大型CSV文件导入MySQL

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 将大型CSV文件导入MySQL脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试将一个csv文件导入到一个 mysql表中,我目前有一个逐行运行的脚本,因为我需要将一个id与另一个id结合使用以及格式化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') &amp;& (($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,请注明来意。