我需要一些帮助。
我在Heroku上有一个php应用程序。在这个应用程序中,有一个表单可以上传csv文件,并在Mysql(cleardb)上导入。
问题是,它的文件很大(永远都很大),而且函数需要太多时间才能完成(大约90秒)。heroku的超时时间是30秒,这是无法改变的。
我试着使用Heroku调度器(像cron一样),但最小频率是10分钟,使用这个调度器可能需要90秒的脚本将需要30分钟,因为正如我所说,Heroku的超时是30秒。
好吧,我能做什么?有替代的时间表吗?
导入示例:
CSV
name,productName,points,categoryName,coordName,date
MYSQL
[用户]
userID
userName
categoryID
coordID
【产品】
productID
productName
[cords]
coordID
coordName
【类别】
categoryID
categoryName
[点]
pointID
productID
userID
value
在所有表中,我都需要进行选择,看看类别coord等是否已经存在。如果存在,则返回id;如果不存在,则插入新行。
我认为没有办法减少执行时间。我正试图找到一种方法,将时间表减少到2分钟、3分钟等。因此,大约10分钟后,所有线路都将被导入。
谢谢!
这就是我开始的地方(因为它实现起来相对简单/快速,应该会给你一个参考点和一些回旋余地,以便在短时间内进行进一步的测试):
将所有数据原样导入临时表(如果服务器的RAM允许,您也可以尝试使用内存引擎)
然后,在导入数据后,创建以下查询所需的索引(并通过EXPLAIN或任何其他显示索引是否使用以及如何使用的工具进行检查):
- 查询临时表中的所有类别,但查询活动数据表中的而非
- 在活动表中创建这些类别
- 查询临时表中但不在活动数据表中的所有坐标。
- 在活动表中创建coords
- 你明白了。。。对所有必要的数据重复上述步骤
- 然后通过INSERT将临时表中的数据导入到活动表中。。。SELECT查询。想想你需要什么样的交易/锁定。可能是查询的顺序会产生影响。但如果你只是添加数据,我认为一个相当低的隔离级别应该可以……但不确定。但也许这不是你现在关心的问题