我正在處理許多csv中的300000行的導入。學說插入許多數據
首先,我將csv導入數據庫中的每一行。
我想解析所有行並將其插入到具有某種關係數據的右表中。
所以我已經試過這樣:
$qb = $this->entityManager->createQueryBuilder();
$flows = $qb->select('flow')
->from('AppBundle:FlowAndata', 'flow')
->getQuery()
->getResult();
$countRows = 0;
foreach ($flows as $row) {
//some check
$entity = new TestTable();
$entity->setCode($row->getCode());
//many other fields
$this->entityManager->persist($entity);
$this->entityManager->flush();
}
在這種情況下,所有的過程花了大約5秒鐘的每一行!
現在如果我添加setMaxResults這樣的:
$qb = $this->entityManager->createQueryBuilder();
$flows = $qb->select('flow')
->from('AppBundle:FlowAndata', 'flow')
->setMaxResults(100)
->getQuery()
->getResult();
花了不到1秒!
所以我想獲得的所有行,並將其與setMaxResult分成遞歸函數是這樣的:
$qb = $this->entityManager->createQueryBuilder();
$flows = $qb->select('flow')
->from('AppBundle:FlowAndata', 'flow')
->getQuery()
->getResult();
$countFlows = count($flows);
$numberOfQuery = $countFlows/100;
for ($i = 0; $i <= $numberOfQuery; $i++) {
$this->entityManager->clear();
$qb = $this->entityManager->createQueryBuilder();
$flows = $qb->select('flow')
->from('AppBundle:FlowAndata', 'flow')
->setFirstResult($i * 100)
->setMaxResults(100)
->getQuery()
->getResult();
}
這樣,我創造了許多查詢分裂成100行。 是一種很好的做法,還是有更好的方法來解析許多行並插入它?
大它的工作原理來得更快! 謝謝 –