|
|
|
| В базу грузятся товары с помощью 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 шт в минуту допустим.??? | |
|
|
|
|
|
|
|
для: clubxaliav
(08.01.2014 в 18:58)
| |
<?
$q = mysql_query("SHOW VARIABLES LIKE 'max_allowed_packet'");
$max = mysql_result($q,0,1);
|
Вернет максимальный размер пакета в байтах для записи. Разделив это значение на максимальную длину всех значений одной записи, узнаем сколько можно сделать многострочных записей, сформировав их. То есть будет не тысяча запросов, а может быть два, три. | |
|
|
|
|
|
|
|
для: confirm
(08.01.2014 в 19:43)
| | Особо не врубился.
Как это подключить к моей загрузке? | |
|
|
|
|
|
|
|
для: 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) для одного цикла записи определяет размер ваших данных, и чтобы узнать этот допустимый размер, необходимо узнать выше показанным способом максимальный размер пакета для записи.
При подготовке данных к записи контролируйте длину их со всем обрамлением (кавычки где надо, скобки, запятые...) по этой установке сервера. Если все ваши данные не превысят этот установленный размер, то запрос к базе будет всего один, иначе несколько, но гораздо меньше чем тысяча. | |
|
|
|
|
|
|
|
для: confirm
(09.01.2014 в 22:57)
| | Многострочный INSERT буду пробывать, спасибо за направление.
А вот по максимальному размеру пакета, этот скрипт оставить без изменений, вставить на страницу с выполнением запроса, он тупа покажет максимум для загрузки, правильно я понял? | |
|
|
|
|
|
|
|
для: clubxaliav
(09.01.2014 в 23:08)
| | Ну а куда же еще его вставлять? Перед подготовкой данных получаете установку сервера этим скриптом. Значение в байтах, это тоже самое что и длина строки, которая тоже выражается в байтах для ASCII. Если данные в UTF, то это надо учитывать при контроле. | |
|
|
|
|
|
|
|
для: confirm
(09.01.2014 в 23:14)
| | А если обновлять данные товары опять тем же файлом, где 10000 товаров - UPDATE можно реализовать упрощенно? | |
|
|
|
|
|
|
|
для: clubxaliav
(09.01.2014 в 23:24)
| | Обновление, это иная операция, подобного для нее нет. | |
|
|
|
|
|
|
|
для: confirm
(09.01.2014 в 23:32)
| | Т.е для обновления придется делить файл в ручную, чтобы не превысить размер максимального пакета? | |
|
|
|
|
|
|
|
для: clubxaliav
(09.01.2014 в 23:35)
| | При чем тут обновление? Вы изначально спрашивали о вставке большого массива данных, как это лучше сделать и по чему надо обязательно ориентироваться вам и было рассказано.
Обновление одним запросом для многих строк сразу так же "кучей" как и вставку можно сделать только тогда, когда у всех строк данные одинаковы. Обновлять придется построчно, ничего делить не надо. Если у вас есть таблица с М числом записей, и вам надо обновить все эти М записей, то тогда вместо обновления можно очистить таблицу, а потом сделать вставку как рассказано выше.
И вообще, по всем этим вопросам в раздел MySQL, объяснив конкретно чего и при каких условиях обновлять, и т.п. | |
|
|
|
|
|
|
|
для: confirm
(09.01.2014 в 23:54)
| | Еще раз спасибо, за разъяснение! | |
|
|
|
|
|
|
|
для: confirm
(09.01.2014 в 23:32)
| | тут Вы утрируете несколько.
ON DUPLICATE KEY .. UPDATE позволяет и обновлять строки пакетом. | |
|
|
|
|
|
|
|
для: Trianon
(10.01.2014 в 02:54)
| | Ну да, но я скорее о не тождественности самого механизма. | |
|
|
|