哪个MYSQL选择方法?

时间:2009-10-14 16:56:01

标签: sql mysql

我有3张桌子。

1st - >制品 第二 - >标签 第3 - > connectionTable

我想选择带有标签的所有产品。我有两种方法。我想问哪一个更有效率。

第一路 - >两个查询使用while

$ query =“SELECT * FROM products”; $ result = mysql_query($ query);

while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    $query  = "SELECT * 
                 FROM connectionTable 
           INNER JOIN labels ON labels.labelID = connectionTable.labelID 
                WHERE productID = " . $row['labelID'];
..
..
} 

###################

第二路 - >使用GROUP_CONCAT()

类似的东西:

SELECT GROUP_CONCAT(labelName) 
  FROM connectionTable 
INNER JOIN labels ON labels.labelID = connectionTable.labelID 
INNER JOIN products ON products.productID = connectionTable.productID 
     WHERE productID = " . $row['labelID'] . " GROUP BY productID;

$ result = mysql_query($ query);

4 个答案:

答案 0 :(得分:1)

两种方法都不好。在这两种情况下,您都有一个循环内的查询。这不是“两个串行SQL查询”,即查询,而是第二个查询,其运行次数与第一个查询中的行数相同。

你应该做的是将标签和connectionTable表添加到循环外的查询中。

答案 1 :(得分:0)

将您的查询转储到phpMyAdmin并使用EXPLAIN?

除此之外,JOIN总是比嵌套查询更快。

答案 2 :(得分:0)

你应该分别进行JOIN而不是2个查询,并解释规划2个查询而不是JOIN'ed将不会告诉你整个故事。

您必须记住,当您执行查询时,实际查询之外会发生需要时间和资源的事情。验证和解析SQL语句(如果您的MySQL版本支持它,可以使用绑定变量稍微减轻),确定检索结果的计划,以及网络时间/流量,尤其是在您访问另一台主机上的数据库时。如果您的第一个查询返回了一百万行,那么您将执行第二次查询一百万次,并且每次都要将网络开销与发送结果一起返回结果集。这比发送一次JOIN查询并将整个数据集作为一个整体返回并进行处理效率低得多。更不用说你在没有使用绑定变量的情况下对DB SQL缓存做了什么。

请注意,效率和响应时间不一样。从用户的角度来看,效率可能会更高。如果用户使用2个单独的查询命中页面,他/她很可能会很快看到结果,因为循环中的各个查询执行并返回可以输出到页面的小返回集。要返回所有行,可能需要比单个JOIN更长的时间。在单个JOIN情况下,用户可能会在返回数据之前等待更长时间,但他们会更快地看到整个数据。

我会使用连接并确保您要加入的列上有索引(即productID)。 label_id,label_name上的连接索引也可能有所帮助,具体取决于表的大小等,但这需要您使用EXPLAIN进行查看以验证。了解您的用户的响应时间和工作时间。

答案 3 :(得分:0)

第一个版本没有运行2个查询,它正在运行1 + number_of_products查询。如果 您正在加载所有产品,这很简单:

  • 运行SELECT * FROM products并创建产品地图,以便您可以通过ID访问它们。
  • 运行SELECT * FROM connectionTable JOIN labels ON labels.labelID = connectionTable.labelID,迭代结果,在上一步的地图中查找产品,并将该行添加到产品条目中。

如果您只想为一组有限的产品执行此操作,请选择它们,收集产品ID并使用与以前相同的查询,但使用WHERE productID IN (?, ?, ?, ...)