【问题标题】:import heavy excel to mysql using php使用php将繁重的excel导入mysql
【发布时间】:2015-06-16 06:14:35
【问题描述】:

我有一个 excel 表,其中包含类似 ex 的数据。如果工作表有“城市”和“人名”列。所以每次我们需要检查城市表(mysql)中是否存在城市,如果不存在,那么将为城市表中的城市插入新行,同样会检查人如果人表(mysql)中不存在名称,那么我们需要将人名保存在人表中。 那么在上面解释的场景中,使用 php 将至少 2gb 的重型 excel 文件导入 mysql 的最佳方法是什么,以便在服务器上以更少的负载执行更少的查询,并且执行将在几分之一秒内完成。 请建议我针对上述情况的优化解决方案。

【问题讨论】:

  • 你看过什么?有很多方法可以解决这个问题,您需要从哪里开始,看看问题出在哪里,无法有人提供完整的解决方案
  • 不明白为什么不导入一次jus
  • 嗨,迈克,你能不能只给我一个更好的方法,它可以用更少的查询和快速的执行来做到这一点@MikeMiller
  • 嗨 Dagon,导入一次不是问题,我希望脚本在更短的时间内执行,在 excel 中每行的查询列更少,如果不存在,则首先检查表是否存在将插入新记录,每一列都关联到不同的表。那么对此的优化解决方案是什么。我最初对使用 set_time_limit(0) 脚本不感兴趣。 @达贡
  • 不要交叉发帖给you did这样的程序员

标签: php mysql excel optimization import


【解决方案1】:

对于需要“规范化”数据的高速摄取,分两步进行(在将原始数据加载到临时表之后):

首先,添加新值(在本例中为 host_name):

# This should not be in the main transaction, and it shoud be with autocommit = ON
# In fact, it could lead to strange errors if this were part of the main transaction and it ROLLBACKed.
INSERT IGNORE INTO HostNorm (host_name)
    SELECT DISTINCT s.host_name
        FROM Staging AS s
        LEFT JOIN HostNorm AS n  ON n.host_name = s.host_name
        WHERE n.host_id IS NULL;

然后抓住host_id 放入Fact 表:

# Also not in the main transaction, and it should be with autocommit = ON
# This multi-table UPDATE sets the ids in Staging:
UPDATE   HostNorm AS n
    JOIN Staging AS s  ON s.host_name = n host_name
    SET s.host_id = n.host_id

More discussion in my blog

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多