2011-01-22 56 views
1

我对“两个或多个单独的SQL命令”或“1但使用'join'SQL命令”的性能表示怀疑。使用两条单​​独的SQL语句或一条SQL语句加入JOIN会更快吗?

这里是东西:

例如,我有两个表:postuser

post已指示该职位为user_id是由一些用户在user

发行和我去提取帖子和用户名。

我可以

 
SELECT * FROM `post` LEFT JOIN `user` on post.user_id = user.id WHERE 1 

 
$rows = $db->sql("SELEFT * FROM `post` WHERE 1") 
for $row in $rows: 
    $db->sql("SELECT * FROM `user` WHERE id = $row['user_id']") 

我不知道哪一个会有更好的表现?

如果我有3个或更多的表加入,哪种方式会更好(从性能角度来看)?

+0

与INNER JOIN相比,使用LEFT JOIN(或RIGHT JOIN或FULL JOIN)有一个(通常很小但不是零)的性能损失。如果可以的话,避免使用LEFT JOIN并使用JOIN。你会有一个没有用户记录的帖子吗?如果不是(你不应该),那么INNER JOIN是合适的。 – 2012-03-03 16:27:36

回答

5

连接几乎总是会有更好的表现。即使它检索的数据“很大”,您仍然只执行单个查询。

这就像买杂货。更容易开车到商店一次,填满一辆车,并与许多不同的物品回家,而不是去商店,买一件东西,回家,再去商店,再买一件。

这些行程中的每一个都会加起来,你最终会花更多的时间驾驶,而不是享受你的杂货。

+0

谢谢!我认为这是一个很好的例子,我现在明白了。 – 2011-01-23 12:58:39

3

强烈建议您使用LEFT JOIN,因为否则将循环中的查询(如第二个示例中所示)会将数据库中的命中数倍增,这也是一种危险情况。

3

请注意,您没有执行2个查询。您正在执行第一个查询一次,第二个查询执行N次,其中N是第一个查询返回的行数。这比让查询优化器处理单个连接查询要昂贵得多。

数据库优化器由专家精心编写,以最大限度地降低运营成本。如果您尝试通过运行单独的查询来再次猜测优化器,则每次都会严重失去 - 除非优化器严重吹响它。除此之外,DBMS必须在每次调用时在第二条语句上准备变体,而不是仅调用一次。优化器必须非常恶劣,以至于不会发生。