快速插入250k行

时间:2012-06-10 21:08:16

标签: php mysql

所以我试图在我的数据库中插入250 000行。由于这只是样本数据,我只需要查询一个x,y变量,它确实会改变for循环,而只是简单地“water”的地形

但这是永远的。任何人都知道如何让这种情况更快发生?

ini_set('max_execution_time', 70000);

$conn = mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('hol', $conn) or die(mysql_error());

for ($y=0;$y<500;$y++) {
    for ($x=0;$x<500;$x++) {
        mysql_query("INSERT INTO map(x, y, terrain) VALUES($x, $y, 'water')");
    }
}

4 个答案:

答案 0 :(得分:8)

使用MySQL LOAD DATA FROM INFILE语句可能会做得更好。批量加载往往比构造大量的insert语句字符串更快。将您的数据写入文件并执行一次LOAD。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

插入/加载还取决于表上的索引数。仅在必要的列上创建索引。通过在将数据加载到表中后添加索引,您也可以获得更好的性能,这样您就不会在添加数据时更新索引。

答案 1 :(得分:3)

INSERT INTO map (x, y, terrain) 
 VALUES ($x, $y, 'water'), ($x, $y, 'water') [etc]

所以你只需要1个查询。

当您添加了400-500个值

时,当然会将查询拆分为多个查询

答案 2 :(得分:2)

您应该确保在自动提交模式下运行250.000(250.000次交易)。

通过在一个事务中发送它们,您将加快速度,因为mysql引擎不必调用其事务机制250.000次。

cf PHP + MySQL transactions examples

mysql_query("START TRANSACTION");
... your requests
mysql_query("COMMIT");

如果您不关心索引的状态,您还应该在开始事务之前删除表中的索引,然后重新创建它们。这将加快速度,因为引擎不需要检查unicity,更新索引,...每行。

答案 3 :(得分:0)

显然,因为第一个语句只有500个值,所以插入值并不是那么重要,你可以使用循环来做到这一点。

INSERT INTO temp500 (value)
  VALUES (0), (1), (2), ... (499);
INSERT INTO map (x, y, terrain)
  SELECT x.value, y.value, 'water'
    FROM temp500 x, temp500 y;