使用PHP将大量数据插入MySQL
所以我的情况如下。我每24小时通过PHP从某个来源获取数据。现在,在这段时间内,这些数据被更改,新的数据被添加或更新。现在,当我每24小时运行一个查询以插入或更新此数据时,执行查询需要很长时间。如果执行时间适中,这不会是一个问题,因为我正计划将其作为一个cron作业,但是现在执行时间太长了。 所以当我获得这些数据时,我正在考虑将这些数据从PHP写入CSV文件。然后将这个CSV文件与使用PHP将大量数据插入MySQL,php,mysql,cron,Php,Mysql,Cron,所以我的情况如下。我每24小时通过PHP从某个来源获取数据。现在,在这段时间内,这些数据被更改,新的数据被添加或更新。现在,当我每24小时运行一个查询以插入或更新此数据时,执行查询需要很长时间。如果执行时间适中,这不会是一个问题,因为我正计划将其作为一个cron作业,但是现在执行时间太长了。 所以当我获得这些数据时,我正在考虑将这些数据从PHP写入CSV文件。然后将这个CSV文件与MySQL LOAD DATA函数一起使用,该函数可以非常快速地从文件中插入大量数据 因此,问题是是否可以从PHP写
MySQL LOAD DATA
函数一起使用,该函数可以非常快速地从文件中插入大量数据
因此,问题是是否可以从PHP写入CSV文件,并以适合加载数据填充
功能的方式对其进行格式化,以及如何在24小时内删除该CSV并使用新插入的数据创建一个新的CSV,我如何正确地使用LOAD DATA infle
函数来处理这个特定的CSV文件?哦,我能用这一切做一个cron工作吗?谢谢。您可以阅读该语句,它非常灵活,您可以指定字段、行分隔符和许多其他功能。这将允许您以您想要的任何格式制作csv。加载数据
确实是在mysql中插入数据的最快方式
在php中,您可以非常简单地将数据写入文件,如图所示
在此之后,您确实需要一个cron作业来加载mysql中的文件,这应该会有所帮助。假设您从源代码接收数据并准备此数组:
$x=array(1=>array('1','2','3','4'), 2=>array('5','6','7','8'));
创建如下所示的csv文件:
$file=fopen(<DIRECTORY_PATH>."file.csv","w");
if(!$file){
//error
}
$csv_data="";
foreach($x as $row){
foreach($row as $element){
$csv_data.=$element.", ";
}
//remove the last comma
$csv_data.="\n";
}
fwrite($file,$csv_data);
$query="load data infile '".<DIRECTORY_PATH>."file.csv"."' into table your_table";
if(!mysqli->query($query))
printf("Error: %s\n", $mysqli->error);
$file=fopen(“.file.csv”,“w”);
如果(!$file){
//错误
}
$csv_data=“”;
外汇($x作为$row){
foreach($行作为$元素){
$csv_数据=$element.“,”;
}
//删除最后一个逗号
$csv_数据=“\n”;
}
fwrite($file,$csv_数据);
$query=“加载数据填充”“文件.csv”“到您的表中”;
如果(!mysqli->query($query))
printf(“错误:%s\n”,$mysqli->Error);
您是否尝试过使用批插入?一个查询中的多个插入比每个查询中的一个插入更快。请看这是正确的程序,实际上您描述了完成此任务的正确方法。简而言之,答案是:是的。批量插入在这里对我没有帮助。我是否需要制作一个cron作业,每24小时用这个新数据生成一个csv文件,然后制作一个mysql过程,使用LOAD data将这个csv插入到表中,或者我可以以某种方式将这两个任务合并到一个cron作业中。为什么批量插入对你没有帮助?您必须插入多少行?我已经尝试过批量插入,它的速度至少快了6倍(至少在我的情况下),记录超过100k。它们不到几秒钟。另外,我使用带有外键的innoDB,速度较慢。