2015-02-16 3 views
1

У меня есть около 2000-3000 записей, которые мне нужно хранить внутри базы данных mysql, и я использую php. Я использую подготовленные инструкции для этого, но по сравнению с обычными запросами скорость падает до 1/3 того, что было!Медленные подготовленные операторы с использованием php mysqli

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

таблицы «плитки» имеет два индекса, первичный ключ (автоинкрементируемые, поэтому оставил здесь) и внешний ключ «МАПИД», значение которого я объявленный и определенное ранее в программе.

Является ли мое использование подготовленных заявлений здесь правильным? Почему он работает намного медленнее, чем без них, и что я могу сделать, чтобы увеличить скорость вставки записей помимо этого?

ответ

1
  1. Ваше использование подготовленного заявления представляется законным.
  2. Вы можете применять ваши запросы вставки в течение одной транзакции.

Упрощенный пример

$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?

+0

Удивительные улучшения используя транзакции! Спасибо! –