나는 매우 기본적이고 간단 InstagramTag라는 단체가 있습니다최적화
class InstagramTag
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="tag", type="string", nullable=true)
*/
protected $tag;
/**
*
* @ORM\OneToMany(targetEntity="App\MainBundle\Entity\InstagramPictureTag", mappedBy="tag")
*/
protected $picturetag;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Get tag
*
* @return string
*/
public function getTag()
{
return $this->tag;
}
/**
* Set tag
*
* @param string $tag
* @return InstagramTag
*/
public function setTag($tag)
{
$this->tag = $tag;
return $this;
}
}
와 나는 기본적으로 특정 태그가 이미 존재로 InstagramTag 있는지 확인이 루틴이 아닙니다. 존재하지 않는 경우 하나를 만드는, 그래서 코드는 다음과 같습니다
foreach ($image->tags as $tag) {
$existingTag = $this->em->getRepository('AppMainBundle:InstagramTag')->findOneByTag($tag);
$instaPictureTag = new InstagramPictureTag();
$instaPictureTag->setPicture($instaShopPicture);
if ($existingTag) {
$instaPictureTag->setTag($existingTag);
} else {
$instagramTag = new InstagramTag();
$instagramTag->setTag($tag);
$this->em->persist($instagramTag);
$instaPictureTag->setTag($instagramTag);
}
$this->em->persist($instaPictureTag);
}
코드가 InstagramTag 테이블이 160 만 개 항목이기 때문에 상대적으로 느립니다. 따라서 1 태그 만 검색하면 MySQL 테이블에서 약 1.3 초가 걸립니다.
마지막 줄이 실제 답변입니다. 태그를 색인화하십시오. 160 만개의 기록은 적절히 색인 될 때 사소한 것입니다. IN 절을 사용하는 것은 좋은 생각이지만 인덱싱이 핵심입니다. http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-index – Cerad