使用php的mysqli缓慢准备语句

时间:2015-02-16 05:30:40

标签: php mysql performance mysqli prepared-statement

我有大约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',我在程序中先前声明和定义的值。

我在这里准备好的陈述是否正确?为什么它运行得比没有它们慢得多,除了这个,我还能做些什么来提高插入记录的速度呢?

1 个答案:

答案 0 :(得分:1)

  1. 您对预准备陈述的使用似乎是合法的。
  2. 您可以在一个交易中应用插入查询。
  3. 简化示例

    $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();
    

    不要忘记在出错时回滚。

    P.S。 MySQL transaction size - how big is too big?