Php 如何提高symfony中多关系的查询性能?

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

您好,我正在为我的应用程序使用symfony 2,并使用sg datatable显示我的数据,现在为我在客户端而不是服务器端使用的数据表提供数据,并使用以下查询:

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);