我正在使用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;
} }
是否有减少处理时间的想法?
提前致谢!
答案 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