Я обрабатываю большие перемещения базы данных для клиента. У нас есть запрос, который извлекает большой объем данных, который необходимо обработать, а затем вставить в другую таблицу. Исходный запрос представляет собой комбинацию объединения нескольких таблиц, чтобы получить его в требуемом формате.
Мы используем собственный класс базы данных, чтобы поместить все результаты запроса (около 600 000 строк с 30 столбцами данных, которые в основном являются строками). Этот массив передается в другой класс (который расширяет ArrayIterator) для выполнения некоторых манипуляций, а затем вставляется в таблицу целевой базы данных.
обнаруживается, что он может очень хорошо обрабатывать небольшие наборы данных и является достаточно быстрым. Но с этим импортом, превышающим полмиллиона строк, кажется, что он становится все медленнее. Мы вычислили расчетное время, оставшееся до конца, используя время, необходимое для обработки предыдущего импорта, но, похоже, оно рассчитывает на 2 часа дождя в течение последних 3 часов.
Первоначально он обрабатывал около сотни в секунду, теперь его всего 2-3.
Вот пример нашего кода:
$sql = "some query";
$array = new Import($sql);
foreach($array as $data){
$db->insert('table', $data);
}
Демонстрация нашего класса итераторов:
class Import extends ArrayIterator {
public function __construct($sql){
//database class parses query and returns all the results into an array
$array = $db->getArray($sql)
parent::__construct($array);
}
public function current() {
$data = parent::current();
//come data processing...
return $data;
}
}
есть идеи по постепенному замедлению? Есть предложения по повышению его эффективности?
Задача ещё не решена.
Других решений пока нет …