所以我试图在我的数据库中插入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')");
}
}
答案 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;