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

Тема в разделе "PHP", создана пользователем асс, 23 мар 2011.

Модераторы: latteo
  1. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    749
    Симпатии:
    220
    Добрый вечер.


    Есть код

    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 к инсертов.
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    можно делать такой запрос
    PHP:
    INSERT INTO tbl_name (a,b,cVALUES(1,2,3),(4,5,6),(7,8,9);
    но учтите что размер такого запроса ограничен, хотя и достаточно большой. Ограничения устанавливаются на сервере

    если так много инсертов то возможно лучше сделать какой-то импорт в БД из файла?
     
  3. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    749
    Симпатии:
    220
    делаю именно из файла.

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

    вот код
    PHP:
    for($d=0$d25000;$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++){

    и так пока не достигнем конца файла.
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    ещё вариант через шелл, если доступ есть, сгенерировать все 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);
     
  5. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    Более корректно будет использовать транзакции...
    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;");
     
    асс нравится это.
  6. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Более корректно будет упомянуть, что транзакции в MySQL поддерживает только innoDB.