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

Форум PHP

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

 

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

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

тема: Оганичение по загрузки данный в БД
 
 автор: clubxaliav   (08.01.2014 в 18:58)   письмо автору
 
 

В базу грузятся товары с помощью xml

$xml = simplexml_load_file("$url_file");
foreach ( $xml->tovars as $tovar )
{
$query = "INSERT INTO tables ......";
mysql_query($query) or die(mysql_error());
}

Как ограничить их загрузку по числу загружаемых позиций? Допустим товаров 10000, это поставит сервер на колени. Можно ли загружать как то по 100 шт в минуту допустим.???

  Ответить  
 
 автор: confirm   (08.01.2014 в 19:43)   письмо автору
 
   для: clubxaliav   (08.01.2014 в 18:58)
 

<?
$q 
mysql_query("SHOW VARIABLES LIKE 'max_allowed_packet'");
$max mysql_result($q,0,1);


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

  Ответить  
 
 автор: clubxaliav   (09.01.2014 в 22:16)   письмо автору
 
   для: confirm   (08.01.2014 в 19:43)
 

Особо не врубился.
Как это подключить к моей загрузке?

  Ответить  
 
 автор: confirm   (09.01.2014 в 22:57)   письмо автору
 
   для: clubxaliav   (09.01.2014 в 22:16)
 

Вставлять в базу тысячи строк как foreach() { insert } это очень плохо. Но есть многострочный вариант вставки: INSERT INTO tbl (field1,field2,...,fieldN) VALUES (value1,value2,...,valueN), (value1,value2,...,valueN),...,(value1,value2,...,valueN)

Поэтому, в цикле нужно не базу гонять, а приготовить строки данных для многострочной записи, а затем уже их вставить в базу. Какой длины будет каждая строка (value1,value2,...,valueN), (value1,value2,...,valueN),...,(value1,value2,...,valueN) для одного цикла записи определяет размер ваших данных, и чтобы узнать этот допустимый размер, необходимо узнать выше показанным способом максимальный размер пакета для записи.
При подготовке данных к записи контролируйте длину их со всем обрамлением (кавычки где надо, скобки, запятые...) по этой установке сервера. Если все ваши данные не превысят этот установленный размер, то запрос к базе будет всего один, иначе несколько, но гораздо меньше чем тысяча.

  Ответить  
 
 автор: clubxaliav   (09.01.2014 в 23:08)   письмо автору
 
   для: confirm   (09.01.2014 в 22:57)
 

Многострочный INSERT буду пробывать, спасибо за направление.

А вот по максимальному размеру пакета, этот скрипт оставить без изменений, вставить на страницу с выполнением запроса, он тупа покажет максимум для загрузки, правильно я понял?

  Ответить  
 
 автор: confirm   (09.01.2014 в 23:14)   письмо автору
 
   для: clubxaliav   (09.01.2014 в 23:08)
 

Ну а куда же еще его вставлять? Перед подготовкой данных получаете установку сервера этим скриптом. Значение в байтах, это тоже самое что и длина строки, которая тоже выражается в байтах для ASCII. Если данные в UTF, то это надо учитывать при контроле.

  Ответить  
 
 автор: clubxaliav   (09.01.2014 в 23:24)   письмо автору
 
   для: confirm   (09.01.2014 в 23:14)
 

А если обновлять данные товары опять тем же файлом, где 10000 товаров - UPDATE можно реализовать упрощенно?

  Ответить  
 
 автор: confirm   (09.01.2014 в 23:32)   письмо автору
 
   для: clubxaliav   (09.01.2014 в 23:24)
 

Обновление, это иная операция, подобного для нее нет.

  Ответить  
 
 автор: clubxaliav   (09.01.2014 в 23:35)   письмо автору
 
   для: confirm   (09.01.2014 в 23:32)
 

Т.е для обновления придется делить файл в ручную, чтобы не превысить размер максимального пакета?

  Ответить  
 
 автор: confirm   (09.01.2014 в 23:54)   письмо автору
 
   для: clubxaliav   (09.01.2014 в 23:35)
 

При чем тут обновление? Вы изначально спрашивали о вставке большого массива данных, как это лучше сделать и по чему надо обязательно ориентироваться вам и было рассказано.

Обновление одним запросом для многих строк сразу так же "кучей" как и вставку можно сделать только тогда, когда у всех строк данные одинаковы. Обновлять придется построчно, ничего делить не надо. Если у вас есть таблица с М числом записей, и вам надо обновить все эти М записей, то тогда вместо обновления можно очистить таблицу, а потом сделать вставку как рассказано выше.

И вообще, по всем этим вопросам в раздел MySQL, объяснив конкретно чего и при каких условиях обновлять, и т.п.

  Ответить  
 
 автор: clubxaliav   (10.01.2014 в 00:00)   письмо автору
 
   для: confirm   (09.01.2014 в 23:54)
 

Еще раз спасибо, за разъяснение!

  Ответить  
 
 автор: Trianon   (10.01.2014 в 02:54)   письмо автору
 
   для: confirm   (09.01.2014 в 23:32)
 

тут Вы утрируете несколько.
ON DUPLICATE KEY .. UPDATE позволяет и обновлять строки пакетом.

  Ответить  
 
 автор: confirm   (10.01.2014 в 10:26)   письмо автору
 
   для: Trianon   (10.01.2014 в 02:54)
 

Ну да, но я скорее о не тождественности самого механизма.

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

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