在 Heroku 应用程序上将大文件导入 mysql

Import big file into mysql, on a Heroku app

我需要一些帮助。

我在 Heroku 上有一个 php 应用程序。在这个应用程序中,有一个上传 csv 文件的表单,要导入 Mysql(cleardb)。

问题在于,文件很大(总是很大),而且函数完成时间太长(大约 90 秒)。 heroku 的超时时间是 30 秒,没有办法改变它。

我尝试使用 Heroku Scheduler(如 cron),但最低频率为 10 分钟,而使用此调度程序可能需要 90 秒的脚本将需要 30 分钟,因为正如我所说,超时heroku 是 30 秒。

嗯,我能做什么?有替代调度程序吗?

导入示例:

CSV

name,productName,points,categoryName,coordName,date

MYSQL

[用户]

userID
userName
categoryID
coordID

[产品]

productID
productName

[坐标]

coordID
coordName

[类别]

categoryID
categoryName

[分]

pointID
productID
userID
value

在所有表格中,我需要创建一个select 来查看类别、坐标等是否已经存在。如果存在,return id,如果不存在,插入一个新行。

我认为没有减少执行时间的方法。我正在尝试找到一种方法将时间表减少到 2 分钟、3 分钟等。因此,在大约 10 分钟内,将导入所有行。

谢谢!

这就是我要开始的(因为它相对simple/quick实施并且应该给你一个参考点和一些回旋余地以便在短时间内进行进一步的测试时间段):

按原样将所有数据导入临时 table(如果服务器的 RAM 允许,您也可以尝试 memory engine)。
然后, 数据导入后,创建以下查询所需的索引(并通过 EXPLAIN 或显示索引是否以及如何使用的任何其他工具进行检查):

  • 查询临时 table 中但 在您的实时数据 table 中的所有类别
    • 在实时 table 中创建这些类别。
  • 查询临时 table 但不在实时数据 table 中的所有坐标。
    • 在实时 table 中创建这些坐标。
  • 你明白了......对所有必要的数据重复。
  • 然后只需通过 INSERT...SELECT 查询将临时 table 中的数据导入到实时 table 中。想想你需要什么样的transaction/locking。 可能查询的顺序会有所不同。但是,如果您只是添加数据,我认为相当低的隔离级别应该可以……但不确定。但也许这不是你现在关心的问题?