Нужна помощь по Insert into sql

асс

Мой дом здесь!
Регистрация
13 Окт 2006
Сообщения
762
Реакции
230
Добрый вечер.


Есть код

PHP:
 for($d=0; $d<  sizeof($ok1[0]);$d++){
            $text= $ok1[0][$d];
     $sql= "INSERT Ignore INTO `domen` VALUES ('', '$text', '', '', '', '', '', '')";
        mysql_query($sql) or die(mysql_error());
      }
          mysql_close();


помогите пожалуйста оптимизировать его, так как строк может быть
до 500 000

А делать так как щас это нагрузка так как надо сделать 500 к инсертов.
 
можно делать такой запрос
PHP:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

но учтите что размер такого запроса ограничен, хотя и достаточно большой. Ограничения устанавливаются на сервере

если так много инсертов то возможно лучше сделать какой-то импорт в БД из файла?
 
можно делать такой запрос
PHP:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
но учтите что размер такого запроса ограничен, хотя и достаточно большой. Ограничения устанавливаются на сервере
если так много инсертов то возможно лучше сделать какой-то импорт в БД из файла?

делаю именно из файла.

если делать как говорите вы, то дает залить не более 20 тысяч
иначе выдает MySQL server has gone away
но как тогда поделить их по 10 к

вот код
PHP:
for($d=0; $d< 25000;$d++){
            $text= $ok1[0][$d];
$qs .= "('', '$text', '', '', '', '', '', ''),";



      }

 $q ="$qs('', 'null', '', '', '', '', '', '');";

    $sql = "INSERT  Ignore  INTO `domen` VALUES $q";
mysql_query($sql) or die(mysql_error());
mysql_close();



но он может влить только 10 к за раз.
иначе выдаст


конечно если только сделать
так чтоб после инсерта данные удалились которые залиты или указатель упал на 20000 ниже и начал не с ноля а с 20 тысяч.



тоесть играть тогда с циклом

for($d=0; $d< 25000;$d++){


for($d=20000; $d< 40000;$d++){

for($d=40000; $d< 60000;$d++){

и так пока не достигнем конца файла.
 
ещё вариант через шелл, если доступ есть, сгенерировать все insertы в файл и импортировать файл
PHP:
shell_exec('mysql --user=admin --password=parol --host=localhost --default-character-set=utf8 --force moyabaza < kucha_insertov.sql');

или использовать INSERT DELAYED тогда инсерты быстро уйдут в память, а в базу когда будет возможность.

Чтоб скрипт не прерывался использовать
PHP:
set_time_limit(0);
 
Более корректно будет использовать транзакции...
PHP:
@mysql_query("START TRANSACTION;");$i=0;
while($ok1[0][$i])
{
mysql_query("INSERT INTO `domen` (`your_field`) VALUES('".$ok1[0][$i]."');");
}
@mysql_query("COMMIT;");
 
Более корректно будет использовать транзакции...
PHP:
@mysql_query("START TRANSACTION;");$i=0;
while($ok1[0][$i])
{
mysql_query("INSERT INTO `domen` (`your_field`) VALUES('".$ok1[0][$i]."');");
}
@mysql_query("COMMIT;");
Более корректно будет упомянуть, что транзакции в MySQL поддерживает только innoDB.
 
Назад
Сверху