0

我有两张桌子:

一个称为数据,每个 ID 只有一个(唯一)行。第二个称为图像,每个 ID 有 3 行。

每次页面加载时,我都想为5 个不同的 ID 获取数据和一张图像。

我现在的问题是:两个单独的 SELECT 查询或一个同时连接的查询。

查询:

...

$all = $row["iD"] // includes **5** last iDs - fetched from DB
$all = implode(',',$all);

SELECT Name, Address FROM data WHERE iD IN($all);
SELECT url FROM images WHERE iD IN ($all) LIMIT 1;

我在页面上已经有 3 个其他选择查询,所以我想知道在性能方面什么是最好的,一个更大 - 加入或两个小 - 更快的查询。

如果加入,这两者将如何加入?

4

3 回答 3

1

您每个 ID 有三个图像,并且希望每个 ID 有一个图像用于最后插入的图像(也称为“最近的内容”)?

然后你可以像这样使用一个简单的自然连接与 group by 结合:

SELECT d.Name, d.Address, MAX(i.url) 
FROM data d, images i
WHERE i.iD = d.iD
GROUP BY d.Name, d.Address
ORDER BY d.iD DESC
LIMIT 5

大多数情况下,最好结合选择来跳过程序开销(例如,在循环本身中调用 mysql_query())。但有时它取决于基础数据。

于 2012-08-31T12:01:50.357 回答
0

有关性能问题的答案,请参阅JOIN queries vs multiple queries。我可以从那里了解到,性能问题因具体情况而异,因此您应该同时测试两者。

对于加入,你可以这样做;

SELECT User.iD, User.Name, User.Address, Image.url
FROM images as Image
JOIN data as User
  ON Image.iD = User.iD
WHERE Image.iD IN ($all)
LIMIT 1;

它尚未经过测试,因此您应该与一粒盐一起服用。这至少是一个起点。

于 2012-08-31T12:15:16.750 回答
0

由于您的查询转到完全独立的表,我建议您保留 2 个单独的查询:这样可以使结果集更小,并且更有可能至少有一个保留在查询缓存中,

关于你的第二个查询:你明白吗,这不能保证获取一个特殊的 URL,但是有吗?主要是第一个键,但不能保证如此。

于 2012-08-31T12:04:33.463 回答