gpt4 book ai didi

php - 将大型 CSV 文件导入 MySQL

转载 作者:可可西里 更新时间:2023-11-01 07:23:13 27 4
gpt4 key购买 nike

我正在尝试将一个 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, 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);
}

任何帮助总是非常感谢。提前致谢。

最佳答案

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

尝试类似的东西(显然未经测试并在 SO 文本框中编码,检查括号匹配 e.c.t.):

$url = 'http://www.example.com/directory/file.csv';
if (($handle = fopen($url, "r")) !== FALSE)
{
fgetcsv($handle, 1000, ",");

$imports = array();

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')))
{

$imports[] = "('".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])."')";



}
}

$importarrays = array_chunk($imports, 100);
foreach($importarrays as $arr) {

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 ".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 配置优化,但这是谷歌真正解释的一个,因为最佳设置因每个人和他们的独特情况而异

编辑:我之前做过的另一件事是,如果您设置了很多导入不需要的 key ,您可以暂时删除这些 key ,然后在导入时将它们添加回来脚本完成。这也可以带来很好的时间改进,但是当您在实时数据库上工作时,如果您沿着这条路走下去,就会遇到一些需要解决的陷阱。

关于php - 将大型 CSV 文件导入 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12622013/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com