|
|
|
| Народ подскажите как ускорить процесс.
Значит так гружу из CSV файла ~50000 строк
for()
{
$insert=mysql_query("insert into $name_table($str1,id_c,id_s,status) value($str2,'$_SESSION[id_client]','$_SESSION[id]','1');");
}
|
Процесс загрузки занимает ~сек 20.
Но есть необходимость иметь возможность откатывать эти данные.
По этому сделал паралельную запись в другую таблицу
for()
{
$insert=mysql_query("insert into $name_table($str1,id_c,id_s,status) value($str2,'$_SESSION[id_client]','$_SESSION[id]','1');");
$select_id_rec=mysql_query("select MAX(id) from $name_table where id_s='$_SESSION[id]';");
$data_id_rec=mysql_fetch_row($select_id_rec);
$insert=mysql_query("insert into upload_history(id_record,id_c,id_s,date,time) value('$data_id_rec[0]','$_SESSION[id_client]','$_SESSION[id]','$date','$time');");
}
|
В итоге процесс записи занимает ~30мин.
Замедляет все скорее всего поиск максимального id [MAX(id)]. | |
|
|
|
|
|
|
|
для: Eser
(07.09.2011 в 12:24)
| | А зачем нужен $data_id_rec и почему вместо него не используется классический auto_increment? Насколько сильна потребность именно в таком способе назначения уникального идентификатора, привязанного к $_SESSION[id]? | |
|
|
|
|
|
|
|
для: cheops
(07.09.2011 в 12:34)
| | Тут все просто.
Первая таблица для хранения и работы с данными в ней как раз:auto_increment(id).
Вторая таблица нужна что бы хранить некий лог о загрузках новых записей, что бы можно было на его основании откатить например последнюю загрузку, в ней auto_increment(id) не спасет , так как они совпадать не могут.
Т.е загрузили в первую таблицу например:
Шипиловская ул 62, ей будет присвоен ID5.
А во второй таблице ей будет присвоен например ID10 т.к данные там уже были какие-то.
Поэтому я загружаю Шипиловская ул 62 в первую таблицу ей присваиваеться например ID5.
id|addres
5|Шипиловская 62
Этот ID5 мне нужно поймать т.к дело все происходит в цикле то MAX(id) вернет мне как раз ID5.
Дальше имея ID записи пишем во сторую таблицу
id |id_record|data |time |
10|5 |2011-09-15|12:20:30 | |
|
|
|
|
|
|
|
для: Eser
(07.09.2011 в 12:53)
| | а чем LAST_INSERT_ID() не устраивает? | |
|
|
|
|
|
|
|
для: Valick
(07.09.2011 в 13:04)
| | Он такую же скорость дает но мож на 2 сек быстрее. | |
|
|
|
|
|
|
|
для: Eser
(07.09.2011 в 13:34)
| | Вы думаете MySQL в его поисках лопатит таблицу через MAX()? Она его из сессии берет, не осуществляя лишнего запроса - у вас из-за этих поисков все медленно и работает. Там где можно использовать auto_increment и last_insert_id() их нужно использовать - вам самим быстрее не сделать. Кроме того, last_insert_id() гарантирует вам ключ вставленной записи, а MAX() может вернуть все, что угодно, если кто-то успеет вставить запись. | |
|
|
|
|
|
|
|
для: Eser
(07.09.2011 в 13:34)
| | почему не используете LOAD DATA INFILE?
еще есть готовый класс для загрузки CSV | |
|
|
|
|
|
|
|
для: Eser
(07.09.2011 в 12:53)
| | как вариант, можно попробовать
INSERT upload_history(id_record,id_c,id_s)
SELECT id ,id_c,id_s FROM $name_tabl WHERE id >= $last_insert_id
Если $date $time заполнять значениями пао умолчанию типа NOW() // или одними значениями
и $last_insert_id получать после/...до... вставки первого ряда | |
|
|
|
|
|
|
|
для: Eser
(07.09.2011 в 12:24)
| | Стоит попробовать сначала сформировь запросы, что бы отправлять не по одной строке, а пачками:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Тогда быстрее будет.
У меня 1.500.000 строк в 30 сек укладывались. Правда если индексы потом добавлять. При наличие индексов все дольше будет. | |
|
|
|