我有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);
答案 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 (?, ?, ?, ...)
。