Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将大型CSV文件导入MySQL_Php_Mysql_Load Data Infile_Fgetcsv - Fatal编程技术网

Php 将大型CSV文件导入MySQL

Php 将大型CSV文件导入MySQL,php,mysql,load-data-infile,fgetcsv,Php,Mysql,Load Data Infile,Fgetcsv,我正在尝试将一个csv文件导入到mysql表中,目前我有一个逐行运行的脚本,因为我需要将一个id与另一个id相结合,并将日期格式化为mysql格式 csv文件的列数超过我当前导入的列数。只导入所有列是否更容易 我在读有关加载数据填充的文章(http://dev.mysql.com/doc/refman/5.1/en/load-data.html),但我想知道如何使用它,在不逐行执行的情况下散列ID并格式化日期。我当前的脚本运行时间太长,导致运行时出现站点性能问题 以下是我所拥有的: $url =

我正在尝试将一个csv文件导入到mysql表中,目前我有一个逐行运行的脚本,因为我需要将一个id与另一个id相结合,并将日期格式化为mysql格式

csv文件的列数超过我当前导入的列数。只导入所有列是否更容易

我在读有关加载数据填充的文章(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, 1000, ",")) !== 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);
}
$url='1!'http://www.example.com/directory/file.csv';
if(($handle=fopen($url,“r”))!==FALSE)
{
fgetcsv($handle,1000,“,”);
while(($data=fgetcsv($handle,1000,“,”)!==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];
$urlink=$data[22];
$data[7]=strotime($data[7]);
$data[7]=日期(“Y-m-d H:i:s”,$data[7]);
如果(($PCatID=='2')&($CountryID=='217')或($CountryID=='38'))| |($GCatID=='16')或($GCatID=='19')或($GCatID=='30')或($GCatID=='32'))
{
如果(!mysql_query(“插入忽略到TNDB_CSV2中
(id、EvID、事件、周期、Per、VName、,
视频、VSA、日期时间、PCatID、PCat、,
CCatID、CCat、GCatID、GCat、城市、,
州,州ID,国家,国家ID,邮编,
TYN,IMAGEURL)值
(“.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])。”)”)
{                    
退出(“
”.mysql_error()); } } } fclose($handle); }

任何帮助都是非常感激的。提前感谢。

尝试使用函数进行批量插入。有关进一步的解释和示例,请参阅此线程

首先尝试优化脚本。首先,导入时不要运行单个查询,除非您别无选择,否则网络开销可能是一个杀手

尝试类似的方法(显然未测试并在SO文本框中编码,请选中括号匹配e.c.t.):

在array_chunk中处理数字太大,可能会导致查询太长(是的,my.cnf中有一个可配置的限制)、太小及其不必要的开销等问题

您也可以放弃使用将$data[x]分配给变量,因为这是一种浪费,因为脚本非常小,只需在查询e.c.t中直接使用$data[x](不会有很大的改进,但根据您的导入大小,它可以节省一点)

下一步是使用低优先级插入/更新,请查看此以了解更多信息,以便开始:

在所有这些之后,你可能会想到mysql配置优化,但这是谷歌真正要解释的,因为最好的设置对于每个人和他们独特的情况都是不同的

编辑:我以前做过的另一件事是,如果设置了大量导入不需要的键,则可以临时删除这些键,并在脚本完成后将其添加回。这也可以带来很好的时间改进,但是当你在一个实时数据库上工作时,如果你沿着这条路线走下去的话,就有一些陷阱需要解决。

我使用了这个查询

$sql = "
        LOAD DATA LOCAL INFILE 'uploads/{$fileName}'
        REPLACE INTO TABLE `order`
        FIELDS
            TERMINATED BY '\t'
        LINES
            TERMINATED BY '\r\n'
        IGNORE 1 LINES
        (product_id, `date`, quantity)
        ";

它的速度非常快

谢谢你的建议Lee,你认为这会有显著的不同吗?应该,测试一下,看看(谷歌搜索php计时器脚本,这样你可以根据自己的喜好对其进行量化,或者查看php.net上的microtime()注释,确保其中有一条可以复制和粘贴)。批处理具有相同插入结构的查询是我在慢速脚本上做的第一件事。然而,实际节省的时间取决于许多因素。现在所需时间不到30秒,而不是15分钟以上。谢谢你的帮助!谢谢你,我会再仔细研究一下。
$sql = "
        LOAD DATA LOCAL INFILE 'uploads/{$fileName}'
        REPLACE INTO TABLE `order`
        FIELDS
            TERMINATED BY '\t'
        LINES
            TERMINATED BY '\r\n'
        IGNORE 1 LINES
        (product_id, `date`, quantity)
        ";