MySQL使用带有2个查询,子查询或连接的select?

时间:2012-08-21 15:05:04

标签: mysql sql performance join

与我的上一个问题(MySQLi performance, multiple (separate) queries vs subqueries)相关,我遇到了另一个问题。

有时我使用子查询从另一个表中选择值(例如,连接到ID的用户名),但我不确定select-in-select,因为它似乎不是很干净,我不确定性能。

子查询可能如下所示:

SELECT
    (SELECT `user_name` FROM `users` 
     WHERE `user_id` = table2.user_id) AS `user_name`
    , `value1`
    , `value2`
FROM
    `table2`
....

对table1的结果使用单独的查询而对table2使用另一个查询是否“更好”(连接加倍,但不需要交叉表),或者我是否应该使用JOIN来获得单个结果查询?

我对JOINS和子查询的经验不多,所以我不确定在这种情况下JOIN是否会“太多”,因为我真的只需要一个名称连接到一个ID(或者可能是计数)来自表格的行数,或者如果无关紧要,因为select-in-select也被视为某种JOIN ......

使用JOIN的解决方案可能如下所示:

SELECT
    users.user_name , table2.value1, table2.value2
FROM
    `table2`
INNER JOIN
    `users`
ON
    users.user_id = table2.user_id
....

如果我更喜欢JOIN,在这种情况下哪一个最好:左连接,内连接或其他什么?

1 个答案:

答案 0 :(得分:6)

您询问是否使用inner joinleft join确实表明您没有对它们做过多少工作。

这两者的目的完全不同,inner join用于从两个或多个表中返回列,其中某些列具有匹配的值。如果希望连接子句中指定的表中的行返回,即使其他表中没有匹配的列,也会使用left join。这取决于您的应用程序。如果一个表有玩家的名字,而另一个表包含他们支付的罚款的详细信息,那么你肯定会想要使用left join来为没有罚款的玩家负责,因此在第二个表中没有记录

关于是否使用子查询或joinjoin在正确使用时可以快得多。通过正确我的意思是,当连接列上有索引时,表按照包含行数的递增顺序指定(通常。可能有例外),连接列具有类似的数据 - 如果所有这些条件匹配,join将是更好的选择。