使用两个单独的SQL语句或一个带有JOIN的SQL语句更快吗?

时间:2011-01-22 02:17:09

标签: mysql

我对“两个或多个单独的SQL命令”或“1但使用'join'SQL命令”的性能存在疑问。

事情就是这样:

例如,我有两个表: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个或更多表要加入,哪种方式会更好(从性能角度来看)怎么办?

3 个答案:

答案 0 :(得分:5)

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

就像买杂货一样。更方便开车去商店,购买推车,带回家的许多不同的物品,而不是去商店,买一件东西,回家,再去商店,买另一件。

每次旅行加起来,你最终会花更多时间开车而不是享用杂货。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

数据库优化器由专家精心编写,以最大限度地降低运营成本。如果你试图通过运行单独的查询来猜测优化器,那么每次都应该丢失,除非优化器严重破坏它。除此之外,DBMS必须在每次调用第二个语句时准备变体,而不是仅仅一次。优化器必须是如此恶毒的错误,以至于它根本不会发生。