当前位置: 首页 > 知识库问答 >
问题:

可笑的慢条令质疑

范稳
2023-03-14

我已经读过一些关于条令性能的文章,但这一查询速度太慢,似乎完全错了:

public function getBetRoundMainDataBuilder(BetRound $betRound){
        $qb = $this->createQueryBuilder('br')
                   ->select('br, uG, u, b, gG, g, t1, t2')
                   ->where('br.id = :bID')
                   ->setParameter('bID', $betRound->getId())
                   ->innerJoin('br.userGroup', 'uG')
                   ->innerJoin('uG.users', 'u')
                   ->innerJoin('br.gameGroup', 'gG')
                   ->leftJoin('gG.games', 'g')
                   ->leftJoin('g.team1', 't1')
                   ->leftJoin('g.team2', 't2')
                   ->leftJoin('br.bets', 'b' );
        return $qb;

    }

我知道它有很多连接,但我想我宁愿在一个查询中查询所有内容,而不是懒惰地加载所有依赖的数据。

我已经分析了代码,尽管此查询没有选择太多数据,但数组移位需要无限时间:

我是不是漏了什么?我甚至将水合模式更改为阵列,但仍然存在问题。

更新:我现在尝试只选择部分,但没有改变太多:

           ->select('partial br.{id},
                     partial uG.{id},
                     partial u.{id, firstName, lastName, nickName, username, imageName},
                     partial b.{id, data},
                     partial gG.{id, title},
                     partial g.{id, data, date},
                     partial t1.{id, name, shortName, shortCode, logoName},
                     partial t2.{id, name, shortName, shortCode, logoName}')

下一步是将查询拆分。

更新2

这是越来越好,我有几个领域在我的视图,我需要不同的数据集。我试图将我的内容分成这些区域,并相应地查询:

主要区域的数据:

  • 贝特朗

现在看起来是这样的:

$qb = $this->createQueryBuilder('br')
        ->select(
            'partial br.{id},
            partial b.{id, data},
            partial gG.{id, title},
            partial g.{id, data, date},
            partial t1.{id, name, shortName, shortCode, logoName},
            partial t2.{id, name, shortName, shortCode, logoName}'
        )
        ->where('br.id = :bID')
        ->setParameter('bID', $betRound->getId())
        ->innerJoin('br.gameGroup', 'gG')
        ->leftJoin('gG.games', 'g')
        ->leftJoin('g.team1', 't1')
        ->leftJoin('g.team2', 't2')
        ->leftJoin('g.bets', 'b', 'WITH', 'b.user = :user')
        ->setParameter('user', $user->getId());
    return $qb;

第二个区域是PointTable

$qb = $this->createQueryBuilder('br')
    ->select('br, b, u, uBs')
    ->where('br.id = :bID')
    ->setParameter('bID', $betRound->getId())
    ->leftJoin('br.bets', 'b')
    ->innerJoin('b.user', 'u')
    ->innerJoin('u.betroundStatus', 'uBs', 'WITH', 'uBs.betRound = :bID');

return $qb;

然后我有第三个区域,它有所有的统计数据。它基本上与第一个查询相同,但包含所有用户的赌注。我现在不确定,我是否应该只使用一个查询所有用户下注,或者为每个用户创建一个查询,或者以某种方式不同。

更新问题:

也许你会看到我有一个根实体叫做贝圆,那种启动所有查询(我现在最多4个复杂的查询从我的贝圆?我只是不知道如何在初始加载后将数据“添加”到我的关系中。正如你可能看到的,有几个连接“路径”从我的测试开始。其中之一是“游戏路径”,看起来像:

  • 下注-

我需要所有这些数据,但是我如何获得一个根实体中具有正确关系的所有数据?如果我查询,例如,我是从游戏组开始,还是总是从我的根实体(=BetRound)开始?

共有2个答案

丁茂
2023-03-14

实际查询(PDOStatement::execute())只占总数的3%。由于与数据库的交互应该是脚本中最慢的部分,所以总执行时间的3%相当快。

绝大多数时间由以下3个方法调用占用:

ArrayHydrator::hydrateRowData()   // 17%
AbstractHydrator::gatherRowData() // 39%
DateTimeType::convertToPHPValue() // 16%

如果你把这个加起来,它是总数的72%。这是任何标准都无法接受的。

  • 补水记录真的有必要吗?
  • 你能消除日期/时间转换吗?

你只需要去追那些罪大恶极的人。把脂肪剃掉。

夏侯昆琦
2023-03-14

我认为有很多左连接可能非常慢。您应该重新生成此查询并删除这些左连接以提高性能。另外,请检查是否在数据库中正确创建了每个键和索引。

总之——这不是学说的错,而是质疑。

 类似资料:
  • 我开始了一个新的反应项目,我想使用笑话作为测试平台。尽管有文档、博客和许多其他资源,如stackoverflow,我总是有一个“意外令牌导入”错误,可能与巴贝尔问题有关,但我的conf似乎还不错。欢迎任何帮助。 我的Jest配置文件(在package.json中)。My package.json具有类似babel jest、babel-preset-es2015、babel preset reac

  • 问题内容: 我正在尝试学习如何使用React和Jest进行单元测试。我遇到了以下错误: 意外的令牌导入 这是我的babel预设: 这是我要测试的文件: 这是我的package.json: 不知道为什么会给我这个信息吗? 问题答案: 您的依赖项中似乎缺少babel-jest。这就是为什么在执行测试之前不在ES6 +代码上运行的原因。

  • 作为我的问题在x86-64中使用32位寄存器/指令的优势的后续行动,我开始衡量指令的成本。我知道这已经做过多次了(例如 Agner Fog),但我这样做是为了娱乐和自我教育。 我的测试代码非常简单(为了简单起见,这里作为伪代码,实际上是在汇编程序中): 但是有些事情还是应该考虑的。 如果循环的内部很大(大 -指令是站不住脚的。对于< code > jmp -指令,我的测试代码如下所示: 其结果是:

  • 一种用于绘制线框样式几何体的材质。 代码示例 const material = new THREE.LineBasicMaterial( { color: 0xffffff, linewidth: 1, linecap: 'round', //ignored by WebGLRenderer linejoin: 'round' //ignored by WebGLRenderer

  • 问题内容: 我在带有打字稿的React Router v5.1.2中使用UseHistory挂钩吗?运行单元测试时,我遇到了问题。 TypeError:无法读取未定义的属性“ history”。 我也尝试使用,但仍然无法正常工作。 问题答案: 浅化使用的反应功能组件时,我需要相同的内容。 在我的测试文件中解决了以下模拟问题:

  • wsl内npm命令特别的慢? 我在wsl内通过npm install XXX时 速度非常的慢。 ping 8.8.8.8 curl baidu.com 都能出来结果 为什么就npm命令特别的慢呢? 我已经按照微软官网上 将wsl设置为镜像网络模式。但是还是很慢,执行命令时不是直接说网络异常 而是一直在运行 但是最后提示超时 有大佬知道咋回事么? curl: (7) Failed to connec