Php 快速插入250k行

Php 快速插入250k行,php,mysql,Php,Mysql,因此,我试图在我的数据库中插入250000行。因为这只是样本数据,所以我只需要查询一个x,y变量,它确实会因此改变for循环和地形,它只是“水” 但这需要很长时间。有人知道我怎样才能让事情更快发生吗 ini_set('max_execution_time', 70000); $conn = mysql_connect('localhost', 'root', '') or die(mysql_error()); mysql_select_db('hol', $conn) or die(mysq

因此,我试图在我的数据库中插入250000行。因为这只是样本数据,所以我只需要查询一个x,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')");
    }
}
ini\u集('max\u execution\u time',70000);
$conn=mysql\u connect('localhost','root','')或die(mysql\u error());
mysql_选择_db('hol',$conn)或die(mysql_error());

对于($y=0;$y您可能会更好地使用MySQL LOAD DATA FROM INFLE语句。批量加载往往比构建大量insert语句字符串更快。将数据写入文件,然后执行一次加载

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

INSERT INTO map (x, y, terrain) 
 VALUES ($x, $y, 'water'), ($x, $y, 'water') [etc]
因此,您只需要一个查询


当然,当您添加了400-500个值时,您应该确保您没有在自动提交模式(250.000个事务)下运行这些250.000个查询

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

碳纤维


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

显然,因为前几行只有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;

是的,但是250k行的字符串长度太长了。@Dagon:当查询有500个“快速”和“25000”值时启动查询不要手拉手,尤其是250k的单个查询!接受@yes123的建议,使用一个查询插入所有值,如果字符串太长,则至少使用更少的查询。为什么我觉得,您真正需要的是从另一个数据库导入数据?恐怕您完全错了。这只是插入一些sample data,上面提供的。很有意思。问题是,在我开始编写一个文件之前,将所有数据写入一个文件需要多长时间load@josmith这取决于磁盘IO活动、磁盘速度、是否将文件写入RAMdisk等等。事实上,我倾向于处理大的单个文件,尤其是文本文件。我不太清楚为什么。@josmith可能是磁盘IO。如果可以的话,用RAMdisk来提高速度。为了提高MyISAM表的性能,对于加载数据填充和插入,通过增加key_buffer_size系统变量来扩大key cache。所以mysql_query(“BEGIN”);可以在一个大事务中完成吗?使用“START transaction”哪一个更标准。请让我了解速度的差异。如果您使用的是像Mysql InnoDB这样的事务引擎,这应该会有所不同。Mysql内部如何处理事务?在提交事务之前,所有250000行是否都会保留在内存中?我不是Mysql核心和特定配置的专家OP的初始化可能会改变一些事情,但在事务执行过程中,会在表上放置一个锁。当锁在表上时,mysql将管理2个表:1个是执行请求的表,1个是原始表的只读快照;
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;