Php 优化聚合搜索结果的检索
我正在使用Zend Framework 1.11,并试图加快客户端应用程序模型数据的检索速度。我试过三种方法,每种方法的速度都差不多,这让我很困惑 对于本例,我正在检索采购订单及其项目和所有关联的地址记录。数据分布在三个表中:Php 优化聚合搜索结果的检索,php,mysql,performance,zend-framework,Php,Mysql,Performance,Zend Framework,我正在使用Zend Framework 1.11,并试图加快客户端应用程序模型数据的检索速度。我试过三种方法,每种方法的速度都差不多,这让我很困惑 对于本例,我正在检索采购订单及其项目和所有关联的地址记录。数据分布在三个表中:采购订单,采购订单项目和采购订单地址 架构如您所料: mysql> DESCRIBE purchase_orders; +--------------------+--------------------------+------+-----+------------
采购订单
,采购订单项目
和采购订单地址
架构如您所料:
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的第三方软件感到恼火,使其难以优化。)我决定根据客户端应用程序的需要加载一对多关联的“多”端,而不是在加载时加载。