|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
18.01.2018, 14:01 | #1 |
Форумчанин
Регистрация: 26.02.2011
Сообщений: 301
|
Загрузка массива в mysql
Есть много строк, которые разбивается на части каждая.
Далее разбитая строку грузится в бд mysql. Все бы хорошо, но тут обнаружил, что очень много времени трачу на выполнения множества запросов. Для примера, 100 000 строк разбить и добавить в бд уходит 1 минута. Но чисто разбить 100 000 строк уходит всего 1 секунда. Вопрос, можно ли, и если да то как?, загрузить многомерный массив одним запросом в таблицу? чувствую это ох как много времени сэкономит. Вообщем интересует пример загрузки многомерного массива с таблицу бд. |
18.01.2018, 14:48 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
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 |
Форумчанин
Регистрация: 26.02.2011
Сообщений: 301
|
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9)
такой вариант неподойдет, каккой же длины эта строка будет, если скажем я 500 000 строк загружу. Я так понял стандартно запросом это не сделать? многомерный массив в таблицу?масссив 100мб пусть будет для теста |
18.01.2018, 16:31 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
А как его короче сделать? Правильно, записать данные в файл и к нему обратиться из запроса. Тоды в xml. Чем load xml не стандартен?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 18.01.2018 в 16:34. |
18.01.2018, 16:40 | #5 |
Форумчанин
Регистрация: 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 Но там в строке все на месте стоит. Не могу понять в чем дело. |
18.01.2018, 16:54 | #6 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
только одно предположение - в строке есть неэкранированные символы (кавычки, апострофы и т.п.)
|
18.01.2018, 17:13 | #7 |
Форумчанин
Регистрация: 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' этот файл берется из папки со скриптом? |
18.01.2018, 18:04 | #8 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
так есть настройка "Максимальная длина создаваемого запроса" (по умолчанию 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); и опять пока длина не достигнет заданной величины. |
|
18.01.2018, 18:13 | #9 |
Форумчанин
Регистрация: 26.02.2011
Сообщений: 301
|
Вот именно так и сделал, я и ваш протестирую способ, но смысл щас такой, я через каждые 100 распарсенных строк отправляю запрос, итого выходит в 100раз меньше запросов к бд, и время сократилось на 100 метровом файле с 400 секунд на 25. Усредненно конечно, но преимущество налицо.
А по поводу LOAD XML LOCAL INFILE '/pathfile/my.xml' INTO TABLE my_tablename. Это шутка шуустро работает? |
18.01.2018, 20:06 | #10 |
Форумчанин
Регистрация: 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 раз ускорили результат. Я доволен)) |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
загрузка данные из тхт в 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 |