За последние 24 часа нас посетили 48449 программистов и 1804 робота. Сейчас ищут 2198 программистов ...

Как ускорить запись данных в базу.

Тема в разделе "Прочие вопросы по PHP", создана пользователем Eser, 7 сен 2011.

  1. Eser

    Eser Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    141
    Симпатии:
    0
    Народ столкнулся с проблемой производительности.
    Мне нужно из внешнего файла загружать например 50000 тыс. заявок, а также возможность откатывать эти загрузки.
    1)загрузил
    2)понял что не то загрузил
    3)откатил
    Причем пользователей загружающими данные может быть несколько.

    С загрузкой все норм 50000 заявок загружаются ~20сек.
    Вот код:
    PHP:
    1. for()
    2. {
    3. $insert=mysql_query("insert into records(adress) value('$adress');");
    4. }
    Заявки записываются и им присваивается auto_increment(id).

    Что бы иметь возможность откатывать изменения, нужно эти данные фиксировать в другой таблице logs.
    Вот код:
    PHP:
    1. for()
    2. {
    3. $insert=mysql_query("insert into records(adress) value('$adress');");
    4. $select_id_rec=mysql_query("select MAX(id) from records;");
    5. $data_id_rec=mysql_fetch_row($select_id_rec);
    6. $insert=mysql_query("insert into logs(id_record,id_c,date,time) value('$data_id_rec[0]','$date','$time');");
    7. }
    Но походу select MAX(id) from records заставляет все тормозить.
    И загрузка занимает ~30мин.

    Т.е логика такая
    Записываем данные в таблицу records
    Ишем ID только что записавшеяся заявки он как раз и будет MAX(id) для текущего проходя цикла
    Получая этот ID пишем его в таблицу logs в поле record_id.

    Подскажите как ускорить процесс или как можно по другому это реализовать.
    LAST_INSERT_ID() тоже низкую производительность дает.
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Eser
    транзакции. но это зависит от того где ты
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если перезаливается вся таблица, то можно создавать новую, старую херить, новую переименовывать в старую.

    вобще это странно, что надо грузить много всякого извне через файл...
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    бред. все записи надо добавлять одним запросом.
    Но лучше LOAD DATA INFILE

    По теме - грузить в другую таблицу, возможно временную, проверять, потом добавлять в основную. Добавлять в оснвную, проверять, потом удалять - неверная логика.

    Но если так надо - вставляешь в таблицу с доп полем insert_date=$t
    а потом одним запросом в лог where insert_date=$t
     
  5. dimka3210

    dimka3210 Активный пользователь

    С нами с:
    17 июн 2010
    Сообщения:
    55
    Симпатии:
    0
    Адрес:
    Брянск
    Eser
    посмотри принцип работы дампера.
    Он за пару тройку секунд умудряется до 17000 строк вставить.
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    это немного. мне пришлось от него отказаться.