gpt4 book ai didi

cakephp - 使用 `contain` 会使 CakePHP 3 find() 调用变慢,而底层查询本身仍然很快

转载 作者:行者123 更新时间:2023-12-04 16:04:46 28 4
gpt4 key购买 nike

我有一个 CakePHP 3 find()调用 I've been trying to optimise一阵子。我将范围缩小到这两个片段,唯一的区别是 contain参数删除。计时由 DebugKit 测量.

包括contain :

public function qrytest() {
$table = TableRegistry::get('OrderOptions', array(
'className' => 'App\Model\Table\Opencart\OrderOptionsTable',
));
$results = $table->find('all', array(
'fields' => array(
'OrderOptions.order_product_id',
'OrderOptions.order_option_id',
'OrderOptions.value',
),
'conditions' => array(
'OrderOptions.order_id' => 123,
),
'contain' => array(
'OpencartProductOptions' => array(
'OpencartOption',
),
'OpencartOrderProducts' => array(
'OpencartOrders' => array(
'OpencartShippingZone',
),
'OpencartProduct' => array(
'OpencartWeightClass',
),
),
'OpencartProductOptionValues',
),
))->all();
$this->viewBuilder()->template('anEmptyView');
}

Sql日志 :1/99 毫秒; 定时器 :4.42 秒/5.72 MB

contain
public function qrytest() {
$table = TableRegistry::get('OrderOptions', array(
'className' => 'App\Model\Table\Opencart\OrderOptionsTable',
));
$results = $table->find('all', array(
'fields' => array(
'OrderOptions.order_product_id',
'OrderOptions.order_option_id',
'OrderOptions.value',
),
'conditions' => array(
'OrderOptions.order_id' => 123,
),
// contain parameter removed; nothing else changed
))->all();
$this->viewBuilder()->template('anEmptyView');
}

Sql日志 :1/92 毫秒; 定时器 :1.06 秒/4.83 MB

摘要 : 包含 contains 参数使 Controller 需要将近 5 秒的时间来呈现,同时不会显着改变实际查询时间。扩展 DebugKit 的 计时器 选项卡显示 Controller 操作:4,388.74 毫秒(屏幕截图 part 1part 2)

这里首先想到的是优化连接和索引,但是如果您查看上面的结果,查询本身在这两种情况下似乎花费了相同的时间。为了确认,我 ran the original query (including JOINs) directly in MySQL Workbench ,它需要大约 100 毫秒,这与我在 DebugKit 输出中看到的相匹配。此外,我实际上确实在一段时间前创建了所有必需的索引。

也就是说,我开始认为问题不在于我的 MySQL 查询,而在于 CakePHP 如何处理它,这就是我需要帮助的地方。

如果您需要,我可以发布表结构信息。

更新
  • 启用和禁用水合作用之间没有区别。两个都试了$query->enableHydration(false);$query->hydrate(false); (根据 query-builder.html#getting-arrays-instead-of-entities)
  • 通过显式设置 'debug' => false 禁用调试,还是慢:时间=4.30s,浏览器测得
  • 这是生成的查询:
    SELECT 
    `OrderOptions`.`order_product_id` AS `OrderOptions__order_product_id`,
    `OrderOptions`.`order_option_id` AS `OrderOptions__order_option_id`,
    `OrderOptions`.`value` AS `OrderOptions__value`
    FROM
    `order_option` `OrderOptions`
    LEFT JOIN `product_option` `OpencartProductOptions` ON `OpencartProductOptions`.`product_option_id` = (
    `OrderOptions`.`product_option_id`
    )
    LEFT JOIN `option` `OpencartOption` ON `OpencartOption`.`option_id` = (
    `OpencartProductOptions`.`option_id`
    )
    LEFT JOIN `order_product` `OpencartOrderProducts` ON `OpencartOrderProducts`.`order_product_id` = (
    `OrderOptions`.`order_product_id`
    )
    LEFT JOIN `order` `OpencartOrders` ON `OpencartOrders`.`order_id` = (
    `OpencartOrderProducts`.`order_id`
    )
    LEFT JOIN `zone` `OpencartShippingZone` ON `OpencartShippingZone`.`zone_id` = (
    `OpencartOrders`.`shipping_zone_id`
    )
    LEFT JOIN `product` `OpencartProduct` ON `OpencartProduct`.`product_id` = (
    `OpencartOrderProducts`.`product_id`
    )
    LEFT JOIN `weight_class` `OpencartWeightClass` ON `OpencartProduct`.`weight_class_id` = (
    `OpencartWeightClass`.`weight_class_id`
    )
    LEFT JOIN `product_option_value` `OpencartProductOptionValues` ON `OpencartProductOptionValues`.`product_option_value_id` = (
    `OrderOptions`.`product_option_value_id`
    )
    WHERE
    `OrderOptions`.`order_id` = 123
  • 这是 XDebug 输出:

    XDebug Output
  • 最佳答案

    我与较大的企业项目一起工作,前端是 CakePHP,但是当您开始讨论快速开发框架的性能时,您提出了这种框架无法自行处理的需求。

    在适当的时候使用 CakePHP,例如从表中显示注册表。

    当我像你一样进入更大的数据集时,我利用数据库资源来解决它们的性能问题,这样我就不会对 CakePHP 的性能期望提出要求。

    使用 EXPLAIN,您可以为 QUERY 设置适当的 INDEX,当它足够优化时,设置一个简单的 View ,例如:

    CREATE VIEW %VIEW-NAME% AS %QUERY%

    如果使用 View 还不够,例如如果 View 仍然有更大的数据集,请开始使用 STORED PROCEDURES,这是一种很好的工作方式,因为您可以让部分程序在数据库中运行,并且您再次使用 CakePHP 仅用于显示这个数据。

    关于cakephp - 使用 `contain` 会使 CakePHP 3 find() 调用变慢,而底层查询本身仍然很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50797354/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com