Эта тема на forum.dklab.ru


AlexTG: ускорение работы скрипта
я новичок и прошу совета.
Задача - загрузка порядка 4000 - 5000 строк в базу MySQL.
Попробовал написать что-то, но получился ужасно тормозной скрипт и загрузка за положенные 30 сек не получается.
Как можно радикально увеличить работу следующего скрипта:
$row = 1;
$handle = fopen("price_tmp.csv", "rt");
while (($data = fgetcsv($handle, 500, ";")) !== FALSE) {
$num = count($data);
$row++;
for ($c=0; $c < $num; $c++) {
$null=$data[0];
$group=$data[1];
$subgroup=htmlspecialchars($data[2]);
$brand=$data[3];
$name=htmlspecialchars($data[4]);
$pri=$data[5];}

$sql = "INSERT INTO `price` VALUES ($null, \"$group\", \"$subgroup\",\"$brand\", \"$name\", $pri)";

$insertdata = mysql_query($sql,$komtex) or die("Invalid query: " . mysql_error());



}
fclose($handle);

e1:
AlexTG
можно увеличить время для исполнения скрипта
set_time_limit()
Andrey Gurin:
Не стоит увеличивать время исполнения скрипта. Основная трата времени происходит при вызове mysql_query, Вы вызываете ее 5000(!) раз. В Вашем случае запрос имеет смысл построить один запрос
который бы выглядел вот так "INSERT INTO `price` VALUES ('а','б','ц','д','е','ф'), ('а','б','ц','д','е','ф'), ('а','б','ц','д','е','ф'), ('а','б','ц','д','е','ф') ... ('а','б','ц','д','е','ф')";

Вот пример кода который примерно так и отработает

$handle = fopen("price_tmp.csv", "rt");
$sql = "INSERT INTO price VALUES ";
$comma = '';
while ( ( $data = fgetcsv($handle, 2048, ";" ) ) !== false )
{
foreach ($data as $k => $v)
{
$data[$k] = htmlspecialchars($v);
}
$data = array_slice($data,0,6); /* Берем нужные значения от 0 до 5 */
$sql .= $comma." ('".join("','",$data)."') ";
$comma = ',';
}

mysql_query($sql) or die("Invalid query: " . mysql_error());
fclose($handle);

Andrey Gurin:
A еще советую почитать вот тут : http://dev.mysql.com/doc/refman/5.0/en/insert.html
INSERT statements that use VALUES syntax can insert multiple rows. To do this, include multiple lists of column values, each enclosed within parentheses and separated by commas. Example:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

AlexTG:
Andrei Gurin,
Огромное спасибо, про один запрос я как-то и не думал.
+1 к карме
Andrey Gurin:
AlexTGСпасибо! (-:
Ant:
AlexTG, ваш вопрос решён?
AlexTG:
Ant, Да.
Забыл залогиниться :(
Ant:
Ок.

Тема закрыта.

Эта тема на forum.dklab.ru