Я разработал приложение для одного из моих клиентов. У него уже есть один. Поэтому мне нужно преобразовать его фактическую базу данных (SQL Server) в новую (MySQL).
Некоторые таблицы SQL Server имеют более 10.000.000 записей. Когда я начинаю начинать разработку этого конвертера, я начал с некоторых таблиц с несколькими записями, поэтому я нахожу все записи и сохраняю их в своей новой базе данных MySQL. Я покажу вам код для лучшего понимания (это только пример)
<?php
namespace Converter\Model;
class PostConverter extends AbstractConverter
{
public function convert()
{
// this is the default connection, it is a mysql database (new application)
$em = $this->getEntityManager();
// this return an alternative connection to the sqlserver database (actual application)
$emAlternative = $this->getEntityManagerAlternative();
// instance of Converter\Repository\Post
$repository = $emAlternative->getRepository('Converter\Entity\Post');
$posts = $repository->findAll();
foreach ($posts as $post)
$post = new Post();
$post->setTitle($object->getTitle());
$em->persist($post);
}
$em->flush();
}
}
Теперь предположим, что таблица Post имеет более 10.000.000 записей. Я не могу просто найти все и перебрать его. Я выйду из ОЗУ. Поэтому я сделал что-то вроде этого.
Класс репозитория:
<?php
namespace Converter\Repository;
class Posts extends \Doctrine\ORM\EntityRepository
{
public function findPosts($limit, $offset)
{
$qb = $this->createQueryBuilder('Post');
$qb->setMaxResults($limit);
$qb->setFirstResult($offset);
return $qb->getQuery->getResult();
}
}
Здесь я нахожу только несколько сообщений во время цикла while. Но это довольно медленно. Я не мог найти лучшего решения для повышения производительности
<?php
namespace Converter\Model;
class PostConverter extends AbstractConverter
{
public function convert()
{
$em = $this->getEntityManager();
$emAlternative = $this->getEntityManagerAlternative();
$repository = $emAlternative->getRepository('Converter\Entity\Post');
$limit = 1000;
while ($object = $repository->findPosts($limit, $offset) {
$post = new Post();
$post->setTitle($object->getTitle());
$em->persist($post);
$offset += $limit;
}
$em->flush();
}
}
Я никогда раньше не делал ничего подобного. Возможно, я ошибусь. Я буду очень признателен, если кто-то из вас может сказать мне правильный, поэтому я могу двигаться дальше.
Спасибо всем
ИЗМЕНИТЬ
Я не могу просто сбрасывать друг друга. То, что я разместил здесь, является всего лишь примером, в преобразовании мне приходится обрабатывать почти все данные перед вставкой в новую базу данных. Его фактическое применение было разработано в 2005 году. База данных даже не нормализована