在PHP中优化此查询

时间:2011-11-03 14:39:19

标签: php mysql

首先,我无法控制数据库结构等。

我需要使用PHP按状态和名称检索记录,但所有数据都在多个表中。基本上我需要尝试理解如何将这两个查询组合起来,以便它们不会运行得那么慢。

首先我用PHP获取记录ID。 (让我们假设$ query返回一个ID数组)

table_products =一堆产品

$query = "SELECT id,name FROM table_products WHERE name = '".$name."';";

我需要遍历这些记录(注意:可能有很多)并找出这些ID位于另外两个表中的位置,这两个表具有它们可能位于的位置信息。

table_places =包含一堆位置的表

link_table =包含产品和位置之间的关系

$state = "somestate";

foreach($query as $row)
    {
    $query_two = "SELECT table_places.name, table_places.id, table_places.state, link_table.place_id, link_table.product_id 
    FROM table_places 
    INNER JOIN link_table 
    ON table_places.id = link_table.place_id 
    WHERE table_places.state = '".$state."' AND link_table.product_id = '".$row->id."';";
    }

上帝,我希望这是有道理的。我不是查询大师,所以如果我能帮助优化它以便更快地运行,我将不胜感激。

3 个答案:

答案 0 :(得分:4)

痛苦在这里:

foreach($query as $row)   <<--- you are pinging the DB to death.

合并两个查询:

SELECT 
  pl.name, pl.id, pl.state, 
  l.place_id, l.product_id,
  pr.name   
FROM table_places pl  
INNER JOIN link_table l ON (pl.id = l.place_id)  
INNER JOIN table_products pr ON (l.product_id = pr.id)
WHERE pr.name = '$name'
  AND pl.state = '$state'
ORDER BY pr.name, pl.state

确保在ON子句和where子句中使用的所有字段上放置索引。

答案 1 :(得分:0)

您可以在一个查询中加入两个以上的表。未经测试的查询类似于;

SELECT * FROM table_products AS prod LEFT JOIN (link_table AS link, table_places AS places)
    ON (prod.id=link.id AND prod.id=places.id)
WHERE some_field='some_value'

这肯定会带来一些性能提升,因为一个查询大多数时候比记录数查询快得多(因为你现在遍历记录并查询db一次记录)

答案 2 :(得分:-2)

答案很简单:无法控制数据库结构 - 无法优化 由于索引是查询优化的基石,您显然需要访问表结构才能添加一个。