使用php将csv数据导入mysql数据库
嗨,我需要导入15000行的csv文件。 我正在使用fgetcsv函数并解析每一行。。 但每次我都会遇到超时错误。 该过程太慢,数据部分导入。 有没有办法让数据导入更快、更高效使用php将csv数据导入mysql数据库,php,mysql,fgetcsv,Php,Mysql,Fgetcsv,嗨,我需要导入15000行的csv文件。 我正在使用fgetcsv函数并解析每一行。。 但每次我都会遇到超时错误。 该过程太慢,数据部分导入。 有没有办法让数据导入更快、更高效 if(isset($_POST['submit'])) { $fname = $_FILES['sel_file']['name']; $var = 'Invalid File'; $chk_ext = explode(".",$fname); if(strtolower($chk_ext[1]) == "c
if(isset($_POST['submit']))
{
$fname = $_FILES['sel_file']['name'];
$var = 'Invalid File';
$chk_ext = explode(".",$fname);
if(strtolower($chk_ext[1]) == "csv")
{
$filename = $_FILES['sel_file']['tmp_name'];
$handle = fopen($filename, "r");
$res = mysql_query("SELECT * FROM vpireport");
$rows = mysql_num_rows($res);
if($rows>=0)
{
mysql_query("DELETE FROM vpireport") or die(mysql_error());
for($i =1;($data = fgetcsv($handle, 10000, ",")) !== FALSE; $i++)
{
if($i==1)
continue;
$sql = "INSERT into vpireport
(item_code,
company_id,
purchase,
purchase_value)
values
(".$data[0].",
".$data[1].",
".$data[2].",
".$data[3].")";
//echo "$sql";
mysql_query($sql) or die(mysql_error());
}
}
fclose($handle);
?>
<script language="javascript">
alert("Successfully Imported!");
</script>
<?
if(isset($\u POST['submit']))
{
$fname=$\u文件['sel\u文件]['name'];
$var='无效文件';
$chk_ext=explode(“.”,$fname);
如果(strtolower($chk_ext[1])==“csv”)
{
$filename=$_文件['sel_文件']['tmp_名称'];
$handle=fopen($filename,“r”);
$res=mysql_查询(“从vpireport中选择*);
$rows=mysql\u num\u rows($res);
如果($rows>=0)
{
mysql_查询(“从vpireport删除”)或死亡(mysql_错误());
对于($i=1;($data=fgetcsv($handle,10000,“,”))!==FALSE;$i++)
{
如果($i==1)
继续;
$sql=“插入到vpireport中”
(项目代码,
公司编号:,
购买,,
购买(单位价值)
价值观
(“$data[0]”,
“$data[1]”,
“$data[2]”,
“$data[3]”;
//回显“$sql”;
mysql_query($sql)或die(mysql_error());
}
}
fclose($handle);
?>
警报(“已成功导入!”);
在页面顶部设置此选项:
set_time_limit ( 0 )
这将使页面无休止地运行。但是,不建议这样做,但如果您没有其他选择,则无法帮助
你可以咨询网站
为了加快速度,您需要检查正在发送的各种SQL,并查看是否创建了正确的索引
如果您调用的是用户定义的函数,而这些函数引用的是全局变量,那么您可以通过将这些变量传递给函数并更改代码以使函数引用这些传递的变量来最大限度地减少所需的时间。引用全局变量比引用局部变量慢。您可以构建一个每500行csv更新一个字符串,如果你在每行上插入mysql,那么立即执行它。这样会更快
另一种解决方案是读取带有偏移量的文件:
读前500行
将它们插入数据库
重定向到csvimporter.php?偏移量=500
返回1.步骤,并读取这次从偏移量500开始的500行
另一种解决方案是使用以下方法将超时限制设置为0:
set_time_limit(0);
只需在php导入页面的开头使用此命令即可
ini_set('max_execution_time',0);
如果这是一次性练习,PHPMyAdmin支持通过CSV导入。
他还提到,用户利用MySQL的加载数据本地内嵌
。这是将数据导入数据库表的一种非常快速的方法
编辑:
下面是一些伪代码:
// perform the file upload
$absolute_file_location = upload_file();
// connect to your MySQL database as you would normally
your_mysql_connection();
// execute the query
$query = "LOAD DATA LOCAL INFILE '" . $absolute_file_location .
"' INTO TABLE `table_name`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(column1, column2, column3, etc)";
$result = mysql_query($query);
显然,您需要确保良好的SQL实践以防止注入等。您可以使用LOAD DATA INFILE,这是一个mysql实用程序,比fgetcsv快得多
有关更多信息,请访问
问题:
将数据插入表的方式会对性能产生巨大影响。对于向服务器发送的每一条记录,15000个插入请求都是巨大的
解决方案::
您应该像mysqldump那样对数据进行分组。在您的情况下,您只需要三条insert语句,而不是如下所示:
在循环写入之前:
$q=“插入vpireport(项目代码、公司id、采购、采购价值)值”
在循环内部,将记录连接到查询,如下所示:
$q .= "($data[0],$data[1],$data[2],$data[3]),";
在循环内部检查计数器是否等于5000、10000或15000,然后将数据插入vpireprot
表,然后再次将$q设置为insert INTO…
。
运行查询并享受!!!这将如何使整个作业更快、更高效?如果你说的是第一种解决方案,它不是逐行向数据库插入值,而是一次插入500行。你能说这不会影响执行吗?当然,如果他需要在没有任何人访问的情况下转储所有内容,这将有所改善。呵呵wever,他提到他需要解析每一行。这意味着他拥有在转储之前处理每一行的逻辑。好吧,但最后它会执行一个INSERT语句,对吗?除非他对行处理的逻辑部分进行优化,否则这是我能想到的最好答案。如果他要逐行插入,那么你的解决方案是什么考虑到额外的CPU使用,一次只处理500行将花费更多的时间1)而不是加载整个结果集,然后2)转发到下一页调用以加载接下来的500行。除了内存极低的服务器无法读取内存中的15000行数据并且需要使用硬盘缓存之外,所有服务器都将否则运行速度会更快。如果你能分享你的代码以及你正在处理的各种复杂问题,也许人们可以通过建议许多其他途径做出更好的反应。@somnath:我已经添加了我的代码。.我尝试设置时间限制(0),但现在我遇到一些sql语法错误。.设置时间限制()与您的错误无关。很可能您的代码没有进展到该代码,并且由于提前30秒到达而过期!这是一个不同的错误,需要相应地解决。请检查我在回答下面的回答,以了解我提出的一些建议。他正在逐行分析!他怎么能告诉我们e用它加载数据?每行的格式必须相同,即用分隔的列的数量应该相同,并且每列应该包含相同的数据类型。在这种情况下,您不需要解析每行。mysql实用程序加载数据填充将为您完成这项工作。@Sachin Puri:我可以用这个加载数据语句代替php中的sql INSERT语句吗