我正在使用 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/