Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2018, 14:01   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию Загрузка массива в mysql

Есть много строк, которые разбивается на части каждая.
Далее разбитая строку грузится в бд mysql. Все бы хорошо, но тут обнаружил, что очень много времени трачу на выполнения множества запросов.

Для примера, 100 000 строк разбить и добавить в бд уходит 1 минута.
Но чисто разбить 100 000 строк уходит всего 1 секунда.

Вопрос, можно ли, и если да то как?, загрузить многомерный массив одним запросом в таблицу? чувствую это ох как много времени сэкономит.

Вообщем интересует пример загрузки многомерного массива с таблицу бд.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 18.01.2018, 14:48   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9)

можно еще в xml заcунуть и

LOAD XML LOCAL INFILE '/pathfile/my.xml' INTO TABLE my_tablename

и что тебе эта минута? По 100000 строк грузишь каждую секунду? Наверняка же разовая или почти разовая загрузка
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.01.2018, 15:22   #3
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9)

такой вариант неподойдет, каккой же длины эта строка будет, если скажем я 500 000 строк загружу.

Я так понял стандартно запросом это не сделать? многомерный массив в таблицу?масссив 100мб пусть будет для теста
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 18.01.2018, 16:31   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А как его короче сделать? Правильно, записать данные в файл и к нему обратиться из запроса. Тоды в xml. Чем load xml не стандартен?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.01.2018 в 16:34.
Аватар вне форума Ответить с цитированием
Старый 18.01.2018, 16:40   #5
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

load xml про него еще почитаю, не работал с ним еще.

А скажите куда копать, если запрос не выполняется php. Я беру составляю запрос, вардампом его вывожу на экран. Беру ручками, вставляю в phpmyadmin - он работает. Этот же текст средствами php не выполняется, пишет You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INSERT INTO logs_data (ip,log_time,method_request,page,ve rsion,code,size_bytes,u' at line 1 Но там в строке все на месте стоит. Не могу понять в чем дело.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 18.01.2018, 16:54   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

только одно предположение - в строке есть неэкранированные символы (кавычки, апострофы и т.п.)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.01.2018, 17:13   #7
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Так то вообще приятная разница когда INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9) таким образом делать, по сравнению, чем по одной записи добавлять. На небольшом файле протестил 3000 строк, скорость во много раз быстрее. Но с большим файлом не работает, начинают ограничения всякие сыпаться.


LOAD XML LOCAL INFILE '/pathfile/my.xml' INTO TABLE my_tablename этот разбирать щас буду

'/pathfile/my.xml' этот файл берется из папки со скриптом?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 18.01.2018, 18:04   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от a.n.o.n.i.m Посмотреть сообщение
На небольшом файле протестил 3000 строк, скорость во много раз быстрее. Но с большим файлом не работает, начинают ограничения всякие сыпаться
можно поступать так, как это делает PHPMyAdmin при экспорте данных в SQL скрипт:

так есть настройка
"Максимальная длина создаваемого запроса"
(по умолчанию 50000)
как только длина запроса INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9),(...) достигла заданной величины, в конце вместо запятой ставится ';'
и повторяется заголовок
INSERT INTO tbl_name (a,b,c) VALUES
(222,223,224),
(225,226,227),
....
(777,778,779);
и опять пока длина не достигнет заданной величины.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.01.2018, 18:13   #9
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Вот именно так и сделал, я и ваш протестирую способ, но смысл щас такой, я через каждые 100 распарсенных строк отправляю запрос, итого выходит в 100раз меньше запросов к бд, и время сократилось на 100 метровом файле с 400 секунд на 25. Усредненно конечно, но преимущество налицо.

А по поводу LOAD XML LOCAL INFILE '/pathfile/my.xml' INTO TABLE my_tablename. Это шутка шуустро работает?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 18.01.2018, 20:06   #10
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Сужу вот по этому параметру select @@max_allowed_packet;
На локалхосте он равен 1048576. На хостинге моем 104857600. Это я к дополнению про дефолтную длину запроса 50 000 символов.

Итого , сейчас работает по принцыпу INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9),(...) . Длину у себя выставил в 1000000 символов. В итоге имеем, раньше чтобы 100мб текста распарсить и залить в таблицу бд,а это где то 350000строк в файле уходило 420секунд. Сейчас выше 20 не поднималось. Разница - в 20 раз ускорили результат. Я доволен))
a.n.o.n.i.m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
загрузка данные из тхт в mysql brownb SQL, базы данных 1 08.08.2017 20:21
Загрузка файла в Mysql Владимир417 Помощь студентам 0 06.11.2014 18:38
Загрузка массива из Memo Enigma_ Помощь студентам 4 10.05.2011 17:36
MySQL. Загрузка файла в blob-поле _SERGEYX_ БД в Delphi 0 16.02.2011 11:24
Загрузка изображения в MySQL [Smarik] БД в Delphi 0 13.02.2009 09:04