Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ускорить загрузку данных в БД
 
 автор: Eser   (07.09.2011 в 12:24)   письмо автору
 
 

Народ подскажите как ускорить процесс.
Значит так гружу из 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)].

  Ответить  
 
 автор: cheops   (07.09.2011 в 12:34)   письмо автору
 
   для: Eser   (07.09.2011 в 12:24)
 

А зачем нужен $data_id_rec и почему вместо него не используется классический auto_increment? Насколько сильна потребность именно в таком способе назначения уникального идентификатора, привязанного к $_SESSION[id]?

  Ответить  
 
 автор: Eser   (07.09.2011 в 12:53)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Valick   (07.09.2011 в 13:04)   письмо автору
 
   для: Eser   (07.09.2011 в 12:53)
 

а чем LAST_INSERT_ID() не устраивает?

  Ответить  
 
 автор: Eser   (07.09.2011 в 13:34)   письмо автору
 
   для: Valick   (07.09.2011 в 13:04)
 

Он такую же скорость дает но мож на 2 сек быстрее.

  Ответить  
 
 автор: cheops   (07.09.2011 в 16:25)   письмо автору
 
   для: Eser   (07.09.2011 в 13:34)
 

Вы думаете MySQL в его поисках лопатит таблицу через MAX()? Она его из сессии берет, не осуществляя лишнего запроса - у вас из-за этих поисков все медленно и работает. Там где можно использовать auto_increment и last_insert_id() их нужно использовать - вам самим быстрее не сделать. Кроме того, last_insert_id() гарантирует вам ключ вставленной записи, а MAX() может вернуть все, что угодно, если кто-то успеет вставить запись.

  Ответить  
 
 автор: Valick   (07.09.2011 в 16:55)   письмо автору
 
   для: Eser   (07.09.2011 в 13:34)
 

почему не используете LOAD DATA INFILE?
еще есть готовый класс для загрузки CSV

  Ответить  
 
 автор: EXP   (07.09.2011 в 16:55)   письмо автору
 
   для: 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 получать после/...до... вставки первого ряда

  Ответить  
 
 автор: vbps   (07.09.2011 в 16:39)   письмо автору
 
   для: 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 сек укладывались. Правда если индексы потом добавлять. При наличие индексов все дольше будет.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования