Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Как ускорить дамп csv в MySQl ?, в csv 400 000 - 500 000 строк
Strannik  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 806
Пользователь №: 17108
На форуме: 7 лет, 8 месяцев, 27 дней
Карма: 0




Добрый день.
В настоящее время столкнулся с очень большим дампом csv->MySql

Мой код дампа:

$filename="base/base.csv";
$handle = fopen("$filename", "r");
while (($data = fgetcsv($handle, 1000000, ";")) !== FALSE)
{
$import_b="INSERT INTO `table1`(`idn`, `period`, `start_saldo`, `earn_m`, `earn_r`, `pay`, `finish_saldo`) VALUES ('$data[2]', '$data[1]', '$data[5]', '$data[7]', '$data[6]', '$data[8]', '$data[9]')";
$import_e="INSERT INTO `table2`(`idn`, `type`, `model`, `date_create`, `serial_number`, `date_of_sealing`, `seal_number`, `state`) VALUES ('$data[2]', '', '$data[11]', '$data[15]', '$data[12]', '', '', '')";
$import_table12="INSERT INTO `table12`(`idn`, `period`, `value`, `pay_type`) VALUES ('$data[2]', '$data[13]', '$data[14]', '$data[10]')";
$sql="SELECT * FROM `table3` WHERE `account` = '$data[3]'";
$res=mysql_query($sql);
if(!$res||mysql_num_rows($res)<1)
{$import_u="INSERT INTO `table3`(`fio`, `account`, `living_space`, `occupancy`, `adress`, `telefone`, `mobile`, `email`, `icq`, `password`, `password_temp`, `status`) VALUES ('$data[3]', '$data[2]', '', '', '$data[4]', '', '', '', '', 'xd', 'xd', 'rrr')";}
else{$import_table3="UPDATE `table3` SET `fio` = '$data[3]', `account` = '$data[2]', `adress` = '$data[4]'";}
$res1=mysql_query($import_table1) or die(mysql_error());
$res2=mysql_query($import_table2) or die(mysql_error());
$res3=mysql_query($import_table12) or die(mysql_error());
$res4=mysql_query($import_table3) or die(mysql_error());
if(!$res1){$r1='<div class="false">$import_table1- ошибка добавления </div>';}else{$r1='<div class="true">$import_table1- добавление успешно </div>';}
if(!$res2){$r2='<div class="false">$import_table2- ошибка добавления </div>';}else{$r2='<div class="true">$import_table2 - добавление успешно </div>';}
if(!$res3){$r3='<div class="false">$import_table12- ошибка добавления </div>';}else{$r3='<div class="true">$import_table12- добавление успешно </div>';}
if(!$res4){$r4='<div class="false">$import_table3- ошибка добавления </div>';}else{$r4='<div class="true">$import_table3- добавление успешно </div>';}
}

fclose($handle);
echo $r1.'<br>'.$r2.'<br>'.$r3.'<br>'.$r4.'<br>Импорт завершен...';


Подскажите как можно уменьшить время работы скрипта?

P.S.: если кто знает подскажите так же ка узнать на какой строчке выполняется скрипт, т.е. если произошла ошибка дампа на строке 1234 заносим ее в переменную ($error.= '1234';)
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Placido  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Наблюдаю
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1241
Пользователь №: 29445
На форуме: 5 лет, 3 месяца, 6 дней
Карма: 143




Например, LOAD DATA INFILE.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Strannik  
 ۩     Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 806
Пользователь №: 17108
На форуме: 7 лет, 8 месяцев, 27 дней
Карма: 0




Placido
Для импорта: путем использования пользовательской переменной для пропуска ненужных полей — например,
array("column1", "@dummy", "column2", "@dummy", "column3")


а возможно ли указание сразу нужных столбцов в таблице MySQl и нужных столбцов в csv, без пропуска ненужных?
т.е. при обычном дампе:
INSERT INTO `table12`(`idn`, `period`, `value`, `pay_type`) VALUES ('$data[2]', '$data[13]', '$data[14]', '$data[10]')


возможно ли такое и в данной функции?

P.S.: потому как порядок столбцов в csv не совпадает с порядком расположения столбцов в бд MySQl...
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Placido  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Наблюдаю
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1241
Пользователь №: 29445
На форуме: 5 лет, 3 месяца, 6 дней
Карма: 143




Не совсем понял вопрос. LOAD DATA INFILE загружает все, что есть в файле, в базу, данные в файле должны соответствовать полям в базе.
Кстати, а зачем делать полмиллиона инсертов? Лучше сформировать один запрос вида
INSERT INTO `table12`(`idn`, `period`, `value`, `pay_type`) VALUES ('1', 'xxx', 'xxx', 'xxx'), ('2', 'xxx', 'xxx', 'xxx'), ('3', 'xxx', 'xxx', 'xxx') 
...
(
'500000', 'xxx', 'xxx', 'xxx');

Если таблица MyISAM, и в ней используются неуникальные индексы, то перед вставкой большого объема данных можно отключить индексы, а после вставки включить обратно - это существенно ускорит вставку.
«ALTER TABLE `table` DISABLE KEYS», потом идет вставка, затем «ALTER TABLE `table` ENABLE KEYS».
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Strannik  
 ۩     Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 806
Пользователь №: 17108
На форуме: 7 лет, 8 месяцев, 27 дней
Карма: 0




Цитата (Placido @ 25.05.2012 - 17:44)
Не совсем понял вопрос. LOAD DATA INFILE загружает все, что есть в файле, в базу, данные в файле должны соответствовать полям в базе.
Кстати, а зачем делать полмиллиона инсертов? Лучше сформировать один запрос вида
INSERT INTO `table12`(`idn`, `period`, `value`, `pay_type`) VALUES ('1', 'xxx', 'xxx', 'xxx'), ('2', 'xxx', 'xxx', 'xxx'), ('3', 'xxx', 'xxx', 'xxx')
... 
('500000', 'xxx', 'xxx', 'xxx');
Если таблица MyISAM, и в ней используются неуникальные индексы, то перед вставкой большого объема данных можно отключить индексы, а после вставки включить обратно - это существенно ускорит вставку.
«ALTER TABLE `table` DISABLE KEYS», потом идет вставка, затем «ALTER TABLE `table` ENABLE KEYS».

Placido
по инсерту - есть ограничение на инсерт - 500 записей по-моему, точно не помню, потом должен быть новый инсерт.

по LOAD DATA INFILE:

у меня же несколько таблиц- нужен дамп в каждую таблицу, а порядок расположения столбцов у них не совпадает, т.е. ипорт данных по стобцам из cvs может быть такой:

csv:      stolbec1, stolbec2, stolbec3, stolbec4
table 1: stolbec2, stolbec4, stolbec3, stolbec1
table 2: stolbec4, stolbec3, stolbec2, stolbec1

и т.д

как быть в данном случае?
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Игорь_Vasinsky  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Лысый и злой
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 25994
Пользователь №: 21350
На форуме: 6 лет, 8 месяцев, 25 дней
Карма: 725

Не курю:
1 год, 2 месяца, 11 дней


а почему не юзать mysqli_multi_query() ??? , 1 запрос.


--------------------
Халявные ответы кончились.
Если нужен готовый код - готовьтесь заплатить.
Райкин тоже был артист

Возле дома был сарай
А когда всё хорошо
Можно просто покурить

user posted image
http://ufa102.xyz/
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Чеширский кот
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 5911
Пользователь №: 1
На форуме: 10 лет, 10 месяцев, 2 дня
Карма: 125

Не пью :
22 года, 3 месяца, 2 дня


Цитата (Placido @ 25.05.2012 - 18:44)
Если таблица MyISAM, и в ней используются неуникальные индексы, то перед вставкой большого объема данных можно отключить индексы, а после вставки включить обратно - это существенно ускорит вставку.

Спасибо! Теперь я понял откуда у меня глюки с переносом больших таблиц. Последний сипекс именно эту хню и делает: вставляет без индексов, а затем включает индексацию. На таблице с сотней миллионов строк сервер вышибает по таймауту, и индексация остается незавершенной, а селекты к этим таблицам выдают полную чушь.


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Strannik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 806
Пользователь №: 17108
На форуме: 7 лет, 8 месяцев, 27 дней
Карма: 0




Игорь_Vasinsky
а ограничения есть на количество строк(составляющих) в 1 запросе?
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Игорь_Vasinsky  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Лысый и злой
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 25994
Пользователь №: 21350
На форуме: 6 лет, 8 месяцев, 25 дней
Карма: 725

Не курю:
1 год, 2 месяца, 11 дней


тока по памяти наверно.

но сам сравни 500 запросов на инсерт либо 1 инсерт на 500 строк - что быстрее и ресурсоёмче?

но подключение на mysqli - придется делать новое либо всё на mysqli переписывать - что актуальней.


--------------------
Халявные ответы кончились.
Если нужен готовый код - готовьтесь заплатить.
Райкин тоже был артист

Возле дома был сарай
А когда всё хорошо
Можно просто покурить

user posted image
http://ufa102.xyz/
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Strannik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 806
Пользователь №: 17108
На форуме: 7 лет, 8 месяцев, 27 дней
Карма: 0




прикол в том, что если делать 1 инсерт на 500 записей, то нужно расширять функционал, а не будет ли это шило на мыло( как впрочем и с mysqli )?
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Engine  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Кто знает что мне делать с моей бедой?
Импортирую дамп ru-википедии (предварительно конвертированный с помощью mwdumper.jar из xml в sql).
Полученной файл Дамп-SQL занимает около 4 ГБ.
Делаю импорт с помощью mysql.exe. Вначале идет быстро, потом замедляется, и чем дельше - тем медленнее.
Когда прошло более 6 часов, а процесс был выполнен только на 40% я остановил импорт.
Видимо дело в каком-то индексировании или обработке.

Подскажите, как ускорить импорт?

P.S. Конфиг: Windows 7x64, ОЗУ= 4,5 ГБ, Проц: Intel D 3200 МГц, Denwer-3 (Denwer3_Base_2010-11-07_apache2.2.4_php5.3.1_mysql-5.1.40_pma3.2.3). Импорт запускал через командная строка cmd.exe x64.

P.S.2 Наверняка не мало тех, кто успешно сделал копию Википедии. Буду признателен если вы выложите здесь короткую инстркуцию вашего метода копирования.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









По сабжу, если интересует только результат - есть замечательная софтинка - сапекс дампер. Огромные дампы проглатывает на ура и достаточно шустро. Советую
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса