Php 如何提高symfony中多关系的查询性能?
您好,我正在为我的应用程序使用symfony 2,并使用sg datatable显示我的数据,现在为我在客户端而不是服务器端使用的数据表提供数据,并使用以下查询:Php 如何提高symfony中多关系的查询性能?,php,mysql,symfony,Php,Mysql,Symfony,您好,我正在为我的应用程序使用symfony 2,并使用sg datatable显示我的数据,现在为我在客户端而不是服务器端使用的数据表提供数据,并使用以下查询: public function indexAction() { $em = $this->getDoctrine()->getManager(); $entities = $em->getRepository('MyAppBundle:Artist') ->createQuer
public function indexAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('MyAppBundle:Artist')
->createQueryBuilder('c')
->select('c.id, c.name, c.sex, c.priority, c.bday, c.bmonth, c.byear')
->getQuery()
->getArrayResult();
$cacsData = $em->createQueryBuilder()
->select('a.id, r.name as role, c.title as work')
->from('MyAppBundle:CastAndCrew', 'q')
->innerJoin('q.role', 'r')
->innerJoin('q.artists', 'a')
->innerJoin('q.content', 'c')
->getQuery()
->getArrayResult();
$cacs = array();
foreach ($cacsData as $cacData) {
if (!array_key_exists($cacData['id'], $cacs)) {
$cacs[$cacData['id']] = array();
}
$cacs[$cacData['id']][] = $cacData;
}
foreach ($entities as &$artist) {
if (!array_key_exists($artist['id'], $cacs)) {
continue;
}
$roles = array();
$contents = array();
foreach ($cacs[$artist['id']] as $cac) {
$roles[] = $cac['role'];
$contents[] = $cac['work'];
}
$artist['role'] = implode('/', array_unique($roles));
$artist['works'] = implode('<br>', array_unique($contents));
}
$encoders = array(new JsonEncoder());
$normalizers = array(new GetSetMethodNormalizer());
$serializer = new Serializer($normalizers, $encoders);
$datatable = $this->get("bbd_datatables.artist");
$datatable->setData($serializer->serialize($entities, "json"));
return $this->render('MyAppBundle:Artist:index.html.twig', array(
"datatable" => $datatable
));
}
公共函数索引()
{
$em=$this->getDoctrine()->getManager();
$entities=$em->getRepository('MyAppBundle:Artister')
->createQueryBuilder('c')
->选择('c.id,c.name,c.sex,c.priority,c.bday,c.bmmonth,c.byear')
->getQuery()
->getArrayResult();
$cacsData=$em->createQueryBuilder()
->选择('a.id,r.name作为角色,c.title作为工作')
->from('MyAppBundle:CastAndCrew','q')
->innerJoin('q.role','r')
->innerJoin('q.artists','a')
->innerJoin('q.content','c')
->getQuery()
->getArrayResult();
$cacs=array();
foreach($cacsData作为$cacData){
如果(!array_key_存在($cacData['id',$cacs)){
$cacs[$cacData['id']]=array();
}
$cacs[$cacData['id'][]=$cacData;
}
foreach($entities as&$Artister){
如果(!array_key_存在($artist['id',$cacs)){
继续;
}
$roles=array();
$contents=array();
foreach($cac[$artist['id']]作为$cac){
$roles[]=$cac['role'];
$contents[]=$cac['work'];
}
$artist['role']=内爆('/',数组_unique($roles));
$artist['works']=内爆(“
”,数组_unique($contents));
}
$encoders=array(新的JsonEncoder());
$normalizers=array(新的GetSetMethodNormalizer());
$serializer=新的序列化程序($normalizers,$encoders);
$datatable=$this->get(“bbd_datatables.artist”);
$datatable->setData($serializer->serialize($entities,“json”));
返回$this->render('MyAppBundle:Artist:index.html.twig',数组(
“datatable”=>$datatable
));
}
一切正常,但问题是查询时间,我的表中有20000多个数据,需要250多毫秒,由于客户端的原因,它暂停了几秒钟,然后显示数据,有人能建议我如何提高性能吗?1。不要试图一口就发送20000张唱片。2.将序列化数据保存到artists.yml中。调整控制器,只加载artists.yaml文件而不是数据库查询。看看这对页面加载时间有多大的影响。这将告诉您应该关注哪个瓶颈。我如何打破它们,因为表有过滤和搜索选项?请执行分页。也可以考虑缓存结果。@ Cerad可以给我一个如何将我的序列化数据保存到ARTSTS.YML的例子吗?谢谢。请同时考虑数据更新非常频繁的事实。FILEL PUTION内容($DATADR.//Stine StudioQuiel.YML),SyfONY\Tea\YAML::DUMP($TANS,10,2);1.不要试图一口就发送20000张唱片。2.将序列化数据保存到artists.yml中。调整控制器,只加载artists.yaml文件而不是数据库查询。看看这对页面加载时间有多大的影响。这将告诉您应该关注哪个瓶颈。我如何打破它们,因为表有过滤和搜索选项?请执行分页。也可以考虑缓存结果。@ Cerad可以给我一个如何将我的序列化数据保存到ARTSTS.YML的例子吗?谢谢。请同时考虑数据更新非常频繁的事实。FILEL PUTION内容($DATADR.//Stine StudioQuiel.YML),SyfONY\Tea\YAML::DUMP($TANS,10,2);1.不要试图一口就发送20000张唱片。2.将序列化数据保存到artists.yml中。调整控制器,只加载artists.yaml文件而不是数据库查询。看看这对页面加载时间有多大的影响。这将告诉您应该关注哪个瓶颈。我如何打破它们,因为表有过滤和搜索选项?请执行分页。也可以考虑缓存结果。@ Cerad可以给我一个如何将我的序列化数据保存到ARTSTS.YML的例子吗?谢谢。请同时考虑数据更新非常频繁的事实。FILEL PUTION内容($DATADR.//Stine StudioQuiel.YML),SyfONY\Tea\YAML::DUMP($TANS,10,2);