多个MySQL查询以及如何使我的脚本更快

时间:2009-12-19 15:11:22

标签: php mysql performance

在这个上使用PHP(1900秒的时间限制和超过1GB的内存限制)和MySQL(使用PEAR :: MDB2)......

我正在尝试创建一个搜索引擎,它将从mysql数据库中的站点源加载数据。有些网站有相当大的Feed,其中包含大量数据(例如,只有一个文件中有超过80,000条记录)。在将记录插入数据库之前完成对每个记录的一些数据检查(可能还插入或更新mysql表的数据检查)。

我的问题是,你们许多人可能已经理解......时间!对于Feed中的每条记录,有超过20条支票,对于例如:10.000条记录的Feed,可能会有> 50.000条插入数据库。

我尝试用两种方式做到这一点:

  1. 读取Feed并将数据存储在数组中,然后遍历数组并执行数据检查和插入。 (这被证明是最快的)
  2. 阅读Feed并逐行进行数据检查并插入。
  3. 数据库使用不断查询的每个字段的索引。 PHP代码被调整而没有额外的变量,SQL查询是简单的select,update和insert语句。

    设置时间限制更高,内存也不是问题。问题是我希望这个操作更快。

    所以我的问题是: 如何更快地导入Feed的数据?还有其他我可能不知道的提示吗?

4 个答案:

答案 0 :(得分:2)

使用LOAD DATA INFILE通常比使用INSERT执行批量加载快许多倍。

即使您必须在PHP代码中进行检查,将其转储到CSV文件然后使用LOAD DATA INFILE,这也是一个很大的胜利。

答案 1 :(得分:1)

如果你的导入是一次性的,并且你使用全文索引,那么加速导入的简单调整就是删除索引,导入所有数据并在导入完成后添加全文索引。这要快得多,according to the docs

  

对于大型数据集,速度要快得多   将数据加载到表中   没有FULLTEXT索引然后创建   之后的索引,比加载   将数据存入已存在的表中   FULLTEXT指数。

答案 2 :(得分:0)

你可以看一下php的PDO扩展,它支持preapeared语句。您还可以考虑在mysql中使用存储过程。 2)您可以查看其他数据库系统,如CouchDB等,并牺牲性能的一致性。

答案 3 :(得分:0)

我设法在1800秒内使用INSERT DELAYED命令将插入的数据加倍。 “LOAD DATA INFILE”建议并非如此,因为数据应该得到强有力的验证,这会弄乱我的代码。 感谢您的所有答案和建议:)