Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 优化聚合搜索结果的检索_Php_Mysql_Performance_Zend Framework - Fatal编程技术网

Php 优化聚合搜索结果的检索

Php 优化聚合搜索结果的检索,php,mysql,performance,zend-framework,Php,Mysql,Performance,Zend Framework,我正在使用Zend Framework 1.11,并试图加快客户端应用程序模型数据的检索速度。我试过三种方法,每种方法的速度都差不多,这让我很困惑 对于本例,我正在检索采购订单及其项目和所有关联的地址记录。数据分布在三个表中:采购订单,采购订单项目和采购订单地址 架构如您所料: mysql> DESCRIBE purchase_orders; +--------------------+--------------------------+------+-----+------------

我正在使用Zend Framework 1.11,并试图加快客户端应用程序模型数据的检索速度。我试过三种方法,每种方法的速度都差不多,这让我很困惑

对于本例,我正在检索采购订单及其项目和所有关联的地址记录。数据分布在三个表中:
采购订单
采购订单项目
采购订单地址

架构如您所料:

mysql> DESCRIBE purchase_orders;
+--------------------+--------------------------+------+-----+-------------------+-----------------------------+
| Field              | Type                     | Null | Key | Default           | Extra                       |
+--------------------+--------------------------+------+-----+-------------------+-----------------------------+
| id                 | int(11)                  | NO   | PRI | NULL              | auto_increment              |
| purchase_order_num | varchar(250)             | NO   | UNI | NULL              |                             |

mysql> DESCRIBE purchase_ord_contents;
+-------------------+---------------------------------------+------+-----+--------------+----------------+
| Field             | Type                                  | Null | Key | Default      | Extra          |
+-------------------+---------------------------------------+------+-----+--------------+----------------+
| id                | int(11)                               | NO   | PRI | NULL         | auto_increment |
| purchase_order_id | int(11)                               | NO   | MUL | NULL         |                |
| sku               | varchar(250)                          | NO   | MUL | NULL         |                |
| name              | varchar(250)                          | YES  |     | NULL         |                |


mysql> DESCRIBE purchase_order_addresses;
+-------------------+------------------------------------+------+-----+-------------+----------------+
| Field             | Type                               | Null | Key | Default     | Extra          |
+-------------------+------------------------------------+------+-----+-------------+----------------+
| id                | int(11)                            | NO   | PRI | NULL        | auto_increment |
| purchase_order_id | int(11)                            | NO   | MUL | NULL        |                |
| label             | varchar(255)                       | NO   |     | NULL        |                |
| address_line_1    | varchar(255)                       | NO   |     | NULL        |                |
....etc.
方法1(findDependentRowset)-约12秒内记录1000条

foreach($this->fetchSearchResults($searchParams) as $orderRow){
    $orderData = $orderRow->toArray();

    // both of these methods call findDependentRowset
    $orderData['items'] = $orderRow->getItems()->toArray();
    $orderData['addresses'] = $orderRow->getAddresses()->toArray();

    $results[] = $orderData;
}
foreach($this->fetchSearchResults($searchParams) as $orderRow){
    $orderData = $orderRow->toArray();

    $orderData['items'] = self::$items->fetchAll(['purchase_order_id = ?' => $row->id])->toArray();
    $orderData['addresses'] = self::$addresses->fetchAll(['purchase_order_id = ?' => $row->id])->toArray();

    $results[] = $orderData;
}
$orderRows   = $this->fetchSearchResults($searchParams);
$orderIds    = array_column($orderRows->toarray(), 'id');
$itemRows    = self::$items->fetchAll(['purchase_order_id IN (?)' => array_values($orderIds)]);
$addressRows = self::$addresses->fetchAll(['purchase_order_id IN (?)' => array_values($orderIds)]);

$searchResults = array_map(function($order) use($itemsRows, $addressRows) {
    $order['contents'] = array_filter($itemsRows->toArray(), function($itemRow) use($order){
        return ($itemRow['purchase_order_id'] === $order['id']);
    });

    $order['addresses'] = array_filter($addressRows->toArray(), function($addressRow) use($order){
        return ($addressRow['purchase_order_id'] === $order['id']);
    });

    return $order;
}, $orderRows->toArray());
方法2(嵌套SQL查询,1000条记录~9秒)

方法3(最小化查询和排序数据,1000条记录~10秒)

我惊讶地发现,尽管消除了约2000个查询,但使用
array.*
函数对数据集进行排序比“方法2”慢,而且比使用Zend的
findDependentRowset


如何加快这些查询的速度?是否有一种方法可以在单个查询中检索订单及其所有项目和地址

其中是孔查询、表创建/结构和孔的解释query@BerndBuffen我添加了模式。查询是通过Zend的查询生成器生成的。您可以添加查询和解释(您的查询)的结果以查看是否使用了索引。我看不到任何类似于
连接的情况,这将是获取所有数据的“正确”方法—只需一次
选择
。我将支持@BerndBuffen对
SHOW CREATE TABLE
(而不是
description
)、实际
选择
解释选择的请求。(我对混淆SQL的第三方软件感到恼火,使其难以优化。)我决定根据客户端应用程序的需要加载一对多关联的“多”端,而不是在加载时加载。