使用PHP将CSV有效导入Mysql以减少数据冗余

使用PHP将CSV有效导入Mysql以减少数据冗余,php,mysql,csv,Php,Mysql,Csv,我有一个大约90MB的CSV文件,我正在尝试有效地解析它,并使用PHP将其插入Mysql数据库,它包含45列和130000多行。因此,我认为仅仅将其转储到数据库中是行不通的,或者可能行不通的。但我决定用链接的外键构建表,以减少冗余 现在,这对我来说是个棘手的问题。对于这样的模式,如何从CSV获取数据并将其快速上传到mysql,同时检查现有重复数据以更新行和插入新数据? 目前,对所有列和行进行排序大约需要4个小时,因为我一次只排序一行。基本上我怎样才能让这更快 指向我的代码的链接是。如果您有访问

我有一个大约90MB的CSV文件,我正在尝试有效地解析它,并使用PHP将其插入Mysql数据库,它包含45列和130000多行。因此,我认为仅仅将其转储到数据库中是行不通的,或者可能行不通的。但我决定用链接的外键构建表,以减少冗余

现在,这对我来说是个棘手的问题。对于这样的模式,如何从CSV获取数据并将其快速上传到mysql,同时检查现有重复数据以更新行和插入新数据? 目前,对所有列和行进行排序大约需要4个小时,因为我一次只排序一行。基本上我怎样才能让这更快


指向我的代码的链接是。

如果您有访问权限,可以通过命令行执行此操作。。假设您的
csv
是由管道
|
分隔的
那么您将:

mysql -uusername -ppassword --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" --local-infile scrapping -e "LOAD DATA LOCAL INFILE 'yourfile.csv'  INTO TABLE database_name.table_name  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n'

在130000行范围内的某些内容应该只需要几分钟,如果

尝试根据禁用外键、唯一键和自动提交

我最近遇到了这个问题,它大大加快了我的转换速度。以下是我的转换中的一个片段(您必须对其进行调整):


当然,您必须确保数据“良好”(无FK冲突)。

使用加载数据填充将CSV文件导入主表,然后保存到其他映射表。外键如何?因为我在mysql中根据位置、销售日期、颜色、损坏情况等分离数据,请参见我编辑的答案。。。它仅对单个会话禁用外键检查。此外,这是假设数据中的外键良好。
$tablesAffected = ['sch_booking_interpreters','sch_booking_clinicians','sch_bookings'];

$bufDb->exec("SET FOREIGN_KEY_CHECKS=0");
$bufDb->exec("SET UNIQUE_CHECKS=0");
$bufDb->exec("SET AUTOCOMMIT=0");

foreach($tablesAffected as $tbl) {
    // https://support.tigertech.net/mysql-large-inserts#disable-mysql-jmp
    $bufDb->exec("alter table ?? disable keys", [$tbl]);
}


foreach($thing as $thang) {
    $bufDb->insert('thing',$thang);
}

foreach($tablesAffected as $tbl) {
    $bufDb->exec("alter table ?? enable keys", [$tbl]);
}

$bufDb->exec("SET FOREIGN_KEY_CHECKS=1");
$bufDb->exec("SET UNIQUE_CHECKS=1");
$bufDb->exec("COMMIT");

echo \Console::FG_GREEN . "∎\n" . \Console::RESET;