5

所以我试图在我的数据库中插入 250 000 行。因为这只是样本数据,我只需要查询 ax, y 变量,它确实会改变,因此 for 循环和只是简单地“水”的地形

但这需要永远。有谁知道我怎样才能更快地实现这一点?

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

4 回答 4

8

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

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

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

于 2012-06-10T21:10:01.117 回答
3
INSERT INTO map (x, y, terrain) 
 VALUES ($x, $y, 'water'), ($x, $y, 'water') [etc]

因此,您只需要 1 个查询。

当然,当您添加 400-500 个值时,将查询拆分为多个查询

于 2012-06-10T21:10:15.123 回答
2

您应该确保您没有在自动提交模式下运行那些 250.000(250.000 个事务)。

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

cf PHP + MySQL 事务示例

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

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

于 2012-06-10T21:15:03.933 回答
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;
于 2012-06-10T21:30:14.220 回答