我有大约2000-3000条记录需要存储在mysql数据库中,我正在使用php。我正在使用预准备语句来执行此操作,但与使用普通查询相比,速度降至原来的1/3!
显示我使用它们的php在下面。
$connection = ...; // a mysqli object
$tile;
$xPos;
$yPos;
$isPass; //variables used in the prep statement.
$insertPrepS = $connection->prepare("INSERT INTO `foo`.`tiles`(MapId,XPos,YPos,Passable) VALUES(?,?,?,?)");
$insertPrepS->bind_param("iiii",$mapId,$xPos,$yPos,$isPass); //$mapId was set up earlier in the code.
$map = new Map(50,50); //has w and h and an array of Tile objects inside.
$map->generateMap(); //sets up the array of Tile objects inside the map
for($y = 0; $y < $map->h; $y++){
for($x = 0; $x < $map->w; $x++){
$tile = $map->getTile(0,0);
$xPos = $tile->x;
$yPos = $tile->y;
$isPass = $tile->passable?1:0;
$insertPrepS->execute();
}
}
表'tiles'有两个索引,一个主键(自动增量,这里省略)和外键'MapId',我在程序中先前声明和定义的值。
我在这里准备好的陈述是否正确?为什么它运行得比没有它们慢得多,除了这个,我还能做些什么来提高插入记录的速度呢?
答案 0 :(得分:1)
简化示例
$connection->begin_transaction();
for($y = 0; $y < $map->h; $y++){
for($x = 0; $x < $map->w; $x++){
$tile = $map->getTile(0,0);
$xPos = $tile->x;
$yPos = $tile->y;
$isPass = $tile->passable?1:0;
$insertPrepS->execute();
}
}
$connection->commit();
不要忘记在出错时回滚。