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

标签 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;     

    }

Controller (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 不太了解,只了解原则 1。就像我在你的代码中看到的那样,你一次只显示 50 个。如果是这种情况,请尝试对股票进行计数(*),将其放入分页器中并每页仅加载 50 个(偏移量和限制)。这应该会有很大帮助。

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

关于mysql - 如何改进 Doctriny 查询以检索大量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22912805/

相关文章:

mysql - 如何在 sql 脚本中而不是在存储过程中选择性地执行某些 sql 语句

php - 像 shell_exec ("echo %username%"之类的查询)不起作用

php - Symfony2 FOSUserBundle 禁用电子邮件确认和用户注册

mysql - 在symfony2中创建表

php - 学说聚合/虚拟专栏

mysql - QueryBuilder 和子条件

php - 如果特定列中有超过 X 个带有 future 日期的条目

javascript - Symfony2 丑化 CSS 和 JS

php - 如何像 Doctrine 2 中的表格一样加入实体?

mysql - 数据库模式、表中的多对多或 bool 值