如何改进Doctriny查询以检索大量数据?

时间:2014-04-07 12:44:29

标签: mysql symfony doctrine-orm

我正在使用Doctrine开发Symfony2项目。 我创建了一个检索股票项目的功能。 如果我的数据库包含少于50 000行,它可以正常工作。 但是,我的项目需要处理超过2 000 000行,如果我使用以下请求,则显示页面需要1分钟以上。

存储库(StockRepository.php):

 public function findAllQuery() {

      $query = $this->createQueryBuilder('s')
                    ->select(array('s','st','p'))           
                    ->join('s.store','st')
                    ->join('s.product','p')
                    ->orderBy('st.name','ASC');     
    return $query;     

    }

控制器(StockController.php):

public function indexAction() {
        $em = $this->getDoctrine()->getManager();
        $entities = $em->getRepository('LiveDataShopBundle:Stock')->findAllQuery();

        $paginator = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
                $entities, $this->get('request')->query->get('page', 1), 50
        );

        return array(
            'pagination' => $pagination,
        );
    }

实体(Stock.php):

<?php

namespace LiveData\Bundle\ShopBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**  * Stock  *  * @ORM\Table()  *
@ORM\Entity(repositoryClass="LiveData\Bundle\ShopBundle\Entity\StockRepository")
*/ class Stock {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \stdClass
     *
     * @ORM\ManyToOne(targetEntity="Store", inversedBy="stocks")
     * @ORM\JoinColumn(name="store_id", referencedColumnName="id",  onDelete="set null")
     */
    private $store;

    /**
     * @var integer
     *
     * @ORM\Column(name="quantity", type="integer")
     */
    private $quantity;

    /**
     * @var \stdClass
     *
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="stocks")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id",  onDelete="set null")
     */
    private $product;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set store
     *
     * @param \stdClass $store
     * @return Stock
     */
    public function setStore($store)
    {
        $this->store = $store;

        return $this;
    }

    /**
     * Get store
     *
     * @return \stdClass 
     */
    public function getStore()
    {
        return $this->store;
    }

    /**
     * Set quantity
     *
     * @param integer $quantity
     * @return Stock
     */
    public function setQuantity($quantity)
    {
        $this->quantity = $quantity;

        return $this;
    }

    /**
     * Get quantity
     *
     * @return integer 
     */
    public function getQuantity()
    {
        return $this->quantity;
    }

    /**
     * Set product
     *
     * @param \stdClass $product
     * @return Stock
     */
    public function setProduct($product)
    {
        $this->product = $product;

        return $this;
    }

    /**
     * Get product
     *
     * @return \stdClass 
     */
    public function getProduct()
    {
        return $this->product;
    } }

是否有减少处理时间的想法?

提前致谢!

2 个答案:

答案 0 :(得分:0)

我不太了解关于教义2的唯一学说1.就像我在你的代码中看到的那样,你一次只显示50个。如果是这种情况,请尝试对股票进行计数(*),将其放入分页器并每页仅加载50(偏移和限制)。这应该会有很大帮助。

或者使用sphinx / solr。但我认为问题是必须从db转移到doctrine2 / symphony2(2.000.000行)的大量数据,尝试调试并获得更多信息。

答案 1 :(得分:0)

如果您的问题是从db到对象的映射,请尝试启用apc(例如)cache:

#app/config/config.yml
doctrine:
    orm:
        metadata_cache_driver: apc
        query_cache_driver: apc