[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запись в БД по этапно
Игорь_Vasinsky
Допустим мне необходимо произвести запись в БД 20000 строк. Кол-во необходимых запросов мне известно.

Есть ли в MySQL такие моменты чтоб запросы "пачками" отправлялись, допустим по 300 запросов с паузой в 2 сек, или это нужен алгоритм php?



Спустя 7 минут, 17 секунд (3.10.2011 - 14:11) Renden написал(а):
Игорь_Vasinsky
Можно создать фунцию в mysql но php наверно проще smile.gif

Спустя 3 минуты, 43 секунды (3.10.2011 - 14:14) m4a1fox написал(а):
Предположение! Юзать LIMIT может с методо sleep wake?

Спустя 9 минут, 23 секунды (3.10.2011 - 14:24) caballero написал(а):
а смысл какой так вставлять?


Спустя 1 минута, 16 секунд (3.10.2011 - 14:25) redreem написал(а):
в самом MySQL есть штука импорте - "Разрешить скрипту разбивать процесс импорта при приближении временного лимита. Может быть использовано при импорте файлов большого размера." - думается для простых запросов есть такая же настрока.

Спустя 6 минут, 5 секунд (3.10.2011 - 14:31) Игорь_Vasinsky написал(а):
caballero я пишу из XLS - 60 000 - 300 000 строк, сервер просто в один момент тупо 404 выкидывает.

sleep то однозначно походу придётся юзать.

я из массив пишу в БД, массив индексный, мысль тока такая:

Допустим я хочу паузу делать после каждого 1000 ного запроса, значит

1. установить set_time_limit(0)
2. в foreach проверять значение ключа на 000 (3 нуля), я думаю это меньше ресурсов займёт - чем производить арифметические действия с ключами (деление и поиск остатка и т.д.)

т.е. как в ключе присутствует 000 - делать sleep(2)

Оптимальней ни как?

Спустя 52 секунды (3.10.2011 - 14:32) Игорь_Vasinsky написал(а):
Цитата (caballero @ 3.10.2011 - 17:24)
в самом MySQL есть штука импорте - "Разрешить скрипту разбивать процесс импорта


я дописываю данные в таблицу.

Спустя 1 минута, 58 секунд (3.10.2011 - 14:34) redreem написал(а):
я имею ввиду, что возможно в самом MySQL есть механизм такого регулирования, раз это с импортом предусмотрено.

Спустя 3 минуты, 14 секунд (3.10.2011 - 14:37) Игорь_Vasinsky написал(а):
redreem
в PMA попробывал.. а он собака SQL запрос не показывает biggrin.gif

Спустя 10 минут, 46 секунд (3.10.2011 - 14:48) Игорь_Vasinsky написал(а):
РАботает вроде... 3 сек sleep установил...

Спустя 4 минуты, 39 секунд (3.10.2011 - 14:53) Winston написал(а):
Можно например в цикле разбивать клоичество строк по 500-60 и потом их записывать
Например
$data = array_slice($data, 0, 500);     // Получаем первые 500 элементов
echo "INSERT INTO `tbl` (`field`) VALUES ('" . implode("', '", $data) . "')"; //
Записываем их

Потом выбираем следующие 500 эл.
$data = array_slice($data, 500, 1000);     // Получаем следующие 500 элементов
echo "INSERT INTO `tbl` (`field`) VALUES ('" . implode("', '", $data) . "')"; //
Записываем их
Ну и по такому принципу далее...

Спустя 2 минуты, 7 секунд (3.10.2011 - 14:55) Игорь_Vasinsky написал(а):
разве мой не оптимальней?

foreach($array as $key=>$value)
{
if(strpos($key, "000"))
sleep(3);
else
//INSERT в БД
}

Спустя 20 минут, 24 секунды (3.10.2011 - 15:15) caballero написал(а):
если сильно растянешь процесс вставки - можешь получить таймаут уже от PHP

попробуй сменить тип таблиц на innodb (только комитить транзакциию нужно явно а не автокоммитом и через каждые например 500 строк)

или попробуй использовать INSERT DELAYED

Спустя 12 минут, 36 секунд (3.10.2011 - 15:28) neadekvat написал(а):
Игорь_Vasinsky, что, на каждую строку свой INSERT пишешь? Конечно не оптимальный.

Спустя 2 часа, 37 минут, 30 секунд (3.10.2011 - 18:05) imbalance_hero написал(а):
Игорь_Vasinsky
Поставь ignore_user_agent, что интересно, что у меня 404 возвращает, а скрипт всё равно продолжает выполнять. Если работа скрипта 5-10 минут, то как раз он будет работать всё это время, а браузер выдаст 404 минуты где-то через 3-4. Это из практики.

INSERT INTO `table` (`id`) VALUES (1),(2),(3),(4) - вот так примерно можно по 100-200-300 упаковывать одним запросом.

Спустя 15 минут, 15 секунд (3.10.2011 - 18:20) Invis1ble написал(а):
Игорь_Vasinsky
я делал примерно так:
$qValues = '';
$query = "INSERT INTO `table` (`field`) VALUES ";
foreach ($data as $value) {
$qValues .= "('" . $value . "'),";
// хак, чтоб мускул не падал от большого пакета
if (strlen($qValues) > 990000) // тут максимальный размер пакета в байтах
{
mysql_query($query . substr($qValues, 0, -1));
$qValues = '';
}
}

// дописываем остатки
if ($qValues != '')
mysql_query($query . substr($qValues, 0, -1));

хз, может и велосипед... :)

Спустя 21 минута, 35 секунд (3.10.2011 - 18:42) imbalance_hero написал(а):
Invis1ble
А как же mb_strlen ?! smile.gif

Спустя 1 минута, 33 секунды (3.10.2011 - 18:44) Игорь_Vasinsky написал(а):
Пока мой вариант работает.. но на вся случай добавлю в закладки.

Спустя 1 минута, 19 секунд (3.10.2011 - 18:45) Invis1ble написал(а):
imbalance_hero
Цитата
А как же mb_strlen ?!

а причем здесь mb_strlen(), если мы байты считаем?

Спустя 12 минут, 1 секунда (3.10.2011 - 18:57) Игорь_Vasinsky написал(а):
1 символ = 1 байт? в юникоде?

Спустя 1 минута, 23 секунды (3.10.2011 - 18:58) Winston написал(а):
Цитата (Игорь_Vasinsky @ 3.10.2011 - 18:57)
1 символ = 1 байт? в юникоде?

1 символ = 2 байта в юникоде.

Спустя 2 минуты, 40 секунд (3.10.2011 - 19:01) Invis1ble написал(а):
Цитата
1 символ = 2 байта в юникоде.

не обязательно
echo strlen('w'); // файл в юникоде

;)

Спустя 1 минута, 22 секунды (3.10.2011 - 19:02) Игорь_Vasinsky написал(а):
Правильней наверно тут ставить вопрос так:

Скока в юникоде 1 байт может содержать символов? или нет?

Спустя 3 минуты, 31 секунда (3.10.2011 - 19:06) Invis1ble написал(а):
Цитата
Правильней наверно тут ставить вопрос так:

Скока в юникоде 1 байт может содержать символов? или нет?

нет smile.gif
вобщем латиница, цифры, пунктуация и т.п. занимает в основном по одному байту, кириллица и прочие символы - 2 байта.

Спустя 2 минуты, 30 секунд (3.10.2011 - 19:08) Игорь_Vasinsky написал(а):
взял на заметку wink.gif

Спустя 1 минута, 1 секунда (3.10.2011 - 19:09) Invis1ble написал(а):
http://www.utf8-chartable.de/
колонка utf-8 (hex) - байты

Спустя 1 минута, 6 секунд (3.10.2011 - 19:10) Winston написал(а):
Цитата (Winston @ 3.10.2011 - 18:58)

1 символ = 2 байта в юникоде.

Да, я не прав. Лучше почитать это.

Спустя 3 минуты, 58 секунд (3.10.2011 - 19:14) Invis1ble написал(а):
Вот, неплохо. Я например не в курсе был, что в utf-8 есть и 3-х, и 4-хбайтные символы


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.