Doctrine Paginator 选择整个表(非常慢)?

2024-04-18

这与之前的问题有关:Doctrine/Symfony 查询生成器在左连接上添加选择 https://stackoverflow.com/questions/39721673/doctrine-symfony-query-builder-add-select-on-left-join?noredirect=1#comment66743717_39721673

我想使用 Doctrine ORM 执行复杂的联接查询。我想选择 10 篇分页博客文章,左侧加入单个作者,例如当前用户的价值以及文章上的主题标签。我的查询生成器如下所示:

$query = $em->createQueryBuilder()
            ->select('p')              
            ->from('Post', 'p')
            ->leftJoin('p.author', 'a')
            ->leftJoin('p.hashtags', 'h')
            ->leftJoin('p.likes', 'l', 'WITH', 'l.post_id = p.id AND l.user_id = 10')
            ->where("p.foo = bar")
            ->addSelect('a AS post_author')
            ->addSelect('l AS post_liked')
            ->addSelect('h AS post_hashtags')
            ->orderBy('p.time', 'DESC')
            ->setFirstResult(0)
            ->setMaxResults(10);

// FAILS - because left joined hashtag collection breaks LIMITS
$result = $query->getQuery()->getResult(); 

// WORKS - but is extremely slow (count($result) shows over 80,000 rows)
$result = new \Doctrine\ORM\Tools\Pagination\Paginator($query, true);

奇怪的是,分页器上的 count($result) 显示了我的表中的总行数(超过 80,000),但使用 foreach 遍历 $result 输出了 10 个 Post 实体,正如预期的那样。我需要做一些额外的配置来正确限制我的分页器吗?

如果这是分页器类的限制,我还有什么其他选择?编写自定义分页器代码或其他分页器库?

(奖励):如何水合数组,例如 $query->getQuery()->getArrayResult();?

编辑:我在函数中遗漏了一个杂散的 orderBy 。看起来同时包含 groupBy 和 orderBy 会导致速度减慢(使用 groupBy 而不是分页器)。如果我省略其中之一,查询就会很快。我尝试在表中的“时间”列上添加索引,但没有看到任何改进。

我尝试过的事情

// works, but makes the query about 50x slower
$query->groupBy('p.id');
$result = $query->getQuery()->getArrayResult();

// adding an index on the time column (no improvement)
indexes:
    time_idx:
        columns: [ time ]

// the above two solutions don't work because MySQL ORDER BY
// ignores indexes if GROUP BY is used on a different column
// e.g. "ORDER BY p.time GROUP BY p.id is" slow

您应该简化您的查询。这会减少一些执行时间。我无法测试您的查询,但这里有一些提示:

  • 执行 count() 时不进行排序
  • 你可以排序orderBy('p.id', 'DESC'),将使用索引
  • 代替左连接()你可以用join()如果连接表中始终存在至少一条记录。否则该记录将被跳过。
  • KNP/Paginator 使用 DISTINCT() 只读取不同的记录,但这可能导致使用磁盘临时表
  • $query->getArrayResult() 使用数组水合模式,返回多维数组,对于大型结果集,它比对象水合快得多
  • 你可以使用部分select('部分p.{id,其他使用的字段}'),这样你就可以只加载需要的字段,在使用对象水合作用时可能会跳过不需要的关系
  • 检查 SF Profiler EXPLAIN 对教义部分下的给定查询,可能未使用索引
  • p.hashtags 和 p.likes 只返回一行还是 oneToMany,这会使结果相乘
  • maybe some Posts design changes, that would remove some joins:
    • 将 p.hashtags 字段定义为@ORM\Column(类型=“数组”)并存储了标签的字符串值。稍后可能会在序列化数组上使用全文搜索。
    • 将 p.likesCount 字段定义为@ORM\Column(类型=“整数”)这会有点赞数

I use KnpLabs/KnpPaginatorBundle https://github.com/KnpLabs/KnpPaginatorBundle并且对于复杂的查询也可能存在速度问题。

通常使用 LIMIT x,z 对于数据库来说很慢,因为它在整个数据集上运行 COUNT。如果不使用索引,速度会非常慢。

您可以使用不同的方法并通过 ID 前进进行一些自定义分页,但这会使您的方法变得复杂。我已将其用于大型数据集(例如 SYSLOG 表)。但是您失去了排序和总记录计数功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Doctrine Paginator 选择整个表(非常慢)? 的相关文章

  • 为什么 SORT_REGULAR 在 PHP 中产生不一致的结果?

    我正在开发一个类 它使 PHP 中的数组排序变得更容易 并且我一直在使用 SORT 常量 但是行为或SORT REGULAR 默认排序类型 似乎有所不同 具体取决于您在数组中添加项目的顺序 此外 我找不到任何模式来解释为什么会出现这种情况
  • $_REQUEST、$_GET、$_POST 哪一个最快?

    这些代码中哪一个会更快 temp REQUEST s or if isset GET s temp GET s else temp POST s REQUEST http php net manual en reserved variabl
  • 如何使用 RewriteRule 来为 PHP 修改 $_SERVER['REQUEST_URI'] ?

    有了这个 htaccess RewriteEngine On RewriteRule foo foo 1 here I tried L PT C etc RewriteRule index php L 我已经尝试了第一个 RewriteRu
  • 为什么使用闭包进行赋值而不是直接将值赋给键?

    我当时正在看在 7 10 他添加了一个数据库依赖项并使用闭包来分配值 我的问题是为什么不直接使用直接赋值 我的意思是不这样做 container db capsule 相当于这样做 container db function contain
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • MySQL小写自动转换

    我有多个在数据库表中写入数据的 Web 服务 我想针对特定字段自动将大写字符串转换为小写字符串 mysql 有没有执行此任务的函数 假设这是表 id name language 有时 在语言字段内 Web 服务会写入大写字符串 IT 我想直
  • 用PHP动态生成二维码[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的网站上生成二维码 他们所要做的就是在其中包含一个 URL 我网站上的变量将提供该 URL
  • filter_input() 何时删除 POST 变量的斜杠?

    我创建了一个小型 PHP 脚本 它在 PHP 5 2 17 的服务器上运行magic quotes gpc指令已启用 我没有对 php ini 文件的写访问权限 并且我想从用户输入中删除所有斜杠 即使magic quotes gpc指令被关
  • 使用 DateTime 类计算日期差异时出错

    我正在尝试使用 DateTime 类 php gt 5 3 来计算 2 个日期的差异 手册中的示例简单明了 我尝试了该示例并且效果很好 但如果改变开始和结束日期 就会出现问题 this gt start date 2011 03 01 th
  • Symfony Serialize 学说实体

    我有一个简单的实体类
  • Errno 121,写入或更新时出现重复密钥?

    SET OLD UNIQUE CHECKS UNIQUE CHECKS UNIQUE CHECKS 0 SET OLD FOREIGN KEY CHECKS FOREIGN KEY CHECKS FOREIGN KEY CHECKS 0 S
  • Opencart 的 $this->config->get('module_var_name')

    我正在尝试自定义 Opencart 支付模块 我看到很多地方都使用了配置信息 但我找不到任何创建正在使用的变量的内容 我知道在管理页面中 如果我选择 paypal 标准 我可以设置所有 配置 信息 但我找不到强调它的 模型 是否有模型 我希
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • 扫描 PHP 上传的病毒

    我目前正在使用以下代码来扫描作为申请表的一部分上传的文件 safe path escapeshellarg dir file command usr bin clamscan stdout safe path out int 1 exec
  • PHP:展平数组-最快的方法? [复制]

    这个问题在这里已经有答案了 是否有任何快速方法可以在不运行 foreach 循环的情况下展平数组并选择子键 在本例中为 键 和 值 或者 foreach 始终是最快的方法 Array 0 gt Array key gt string val
  • 原则 2 缓存:我可以将缓存与 Repository::find*() 一起使用吗?

    我是缓存新手 从文档中 我可以在查询中使用缓存 但是像这样的方法呢 em gt find Application Models project 1 如果你寻找一种自动性 我认为遮阳篷不是 他们不是这样的东西 我自己也在寻找这样的东西 您可以
  • Heredoc:常用的“EOT”实际上是什么意思?

    PHP s 定界例子 http www php net manual en language types string php language types string syntax heredoc似乎总是使用 EOT 有时是 EOD 作
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • 根据最大值连接表

    这是我正在谈论的内容的一个简化示例 Table students exam results id name id student id score date 1 Jim 1 1 73 8 1 09 2 Joe 2 1 67 9 2 09 3
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel

随机推荐

  • 如何在 Visual Studio 2015 中创建新分支?

    我在 Visual Studio 2015 中将 Git 与 Visual Studio Online 结合使用 并试图弄清楚如何创建分支 这是网上常见的答案 https msdn microsoft com en us library h
  • 由于地理位置邻近公式(商店定位器)而导致结果缺失

    好的 我已经断断续续地与这个问题斗争了大约 3 个月 因为我已经用尽了我遇到的所有地理邻近公式 但我距离获得正确的结果还差得很远 我认为是时候了寻求帮助 THE AIM 我正在设置一个相当基本的商店定位器实现 用户输入邮政编码并从预定义的搜
  • Vue.use() 抛出“无法读取未定义的属性‘use’”

    尝试1 main js import createApp from vue import store from store store import App from App vue Vue config productionTip fal
  • 对列表进行排序,使特定值位于顶部

    我有课Offer其中包含一个已归档的类别 我希望特定类别的所有优惠都显示在顶部 然后是其他所有优惠 我试过了 但没有效果 你有什么推荐的吗 Offers Offers OrderBy x gt x Category Corporate To
  • 迭代多级提升树

    我的树看起来像这样 Library L ID 1 Book B ID 1 Title Moby Dick Book B ID 2 Title Jurassic Park Library L ID 2 Book B ID 1 Title Ve
  • Android 为 FLAG_TRANSLUCENT 禁用 ActionBar 和 NavigationBar 的叠加

    如图所示 导航栏和状态栏重叠布局 我所做的只是 if Build VERSION SDK INT gt Build VERSION CODES KITKAT Window w getWindow w setFlags WindowManag
  • 结合 EditText 和 Button?

    在某些应用程序中 我看到 EditText 小部件与右侧的按钮结合在一起 例如Twitter 应用程序中的搜索字段 http 2 bp blogspot com GTM W5mVPTU S rmYdiUTCI AAAAAAAAAEE hIO
  • 使用 alembic 自动生成时忽略模型

    我正在尝试使用自动生成数据库的修订版本alembic 这样做时 我想忽略一些模型 它们具有当前版本的 MySQL 不支持的数据类型 这是我尝试过的方法 似乎工作正常 但我不确定这是最惯用的方法 inside alembic env py d
  • Eclipse RCP - 创建视图后立即添加侦听器

    问候 Stackoverflow 的同胞们 我正在开发 Eclipse RCP 应用程序 并且必须添加SelectionListener to the Project Explorer view创建后的那一刻 我意识到我无法在我的贡献插件的
  • Android:活动对话框/对话框意外消失

    我有一个申请TabActivity每次从引擎 NDK C 代码 收到回调时 我都会在其中显示一个对话框 我确保当应用程序处于恢复状态时显示对话框 收到引擎的回调后 我启动NetworkDownDialog活动 但这会导致对话框停留一秒钟然后
  • 如何将 NHibernate 与 System.Tuple 等不可变类型一起使用?

    我有一个复合映射使用System Tuple
  • 为什么LogCat充满了错误?

    我尝试让 Android 应用程序消除任何错误 我绝对确定 这些都不是我的错误 当然 可能会有不同的系统信息消息 但我将日志级别设置为 警告 之后我仍然看到很多字符串 它们同时填充日志窗口 举个例子 01 21 20 47 13 336 4
  • Ruby 中什么计算结果为 false?

    false and nil评估为false in Ruby 还要别的吗 请提供官方 权威参考文献的链接 2 0 0p247 001 gt if true puts TRUE else puts FALSE end TRUE 2 0 0p24
  • 如何实现xxx.domainname.com URL模式?

    考虑 blogspot com 的情况 域名只是一个 blogspot com 但假设我用 xxx 注册 那么我将拥有 xxx blogspot com 这里它不会是子域名 我可以闻到 但是它有些不同 如何实现这一点 在 j2ee Web
  • 如何比较 Python 中的版本号?

    我正在遍历一个包含鸡蛋的目录 将这些鸡蛋添加到sys path 如果目录中有同一个 egg 的两个版本 我只想添加最新的一个 我有一个正则表达式r P
  • 使用 React JS 和 Laravel 处理多个图像上传

    我想通过reactjs中的axios将多个图像上传到数据库 将数据从客户端发送到服务器端 并在服务器端使用laravel处理图像上传 我的问题是 每当我尝试在服务器端处理多个图像时 它都不起作用 这是我的代码 客户端 ReactJS 建设者
  • select.select() 没有捕获套接字上的异常条件?

    Python 2 7 Windows XP 我有一个向客户端发送消息的服务器 我使用 select 模块来检查套接字是否准备好接收 以及捕获异常情况 我的印象是 如果客户端关闭了套接字 select 会在异常条件套接字列表中返回所述套接字
  • Firefox 与 Chrome 的 iMacros 对比

    哪种浏览器更适合使用 iMacros 我更喜欢跑得更快的 也尝试解释一下 如果这只是一个快速答案 请发表评论 我发现使用 iMacros 的 Firefox 比 Chrome 快得多 我 90 的任务都使用 Chrome 但在做一些宏观任务
  • 使用 sqlite3 驱动程序在 QSqlQuery 中使用多个 sql 语句

    我有一个包含多个 SQL 语句的文件 我想用它们来初始化新的 sqlite3 数据库文件 显然 sqlite3 仅通过以下方式处理一个查询中的多个语句 sqlite3 exec 函数 以及not通过prepare step finalize
  • Doctrine Paginator 选择整个表(非常慢)?

    这与之前的问题有关 Doctrine Symfony 查询生成器在左连接上添加选择 https stackoverflow com questions 39721673 doctrine symfony query builder add