2013-03-09 46 views
0

我有两个表:MySQL的左连接对2个单独的查询(性能)

++++++++++++++++++++++++++++++++++++ 
|    Games    | 
++++++++++++++++++++++++++++++++++++ 
| ID | Name | Description  | 
++++++++++++++++++++++++++++++++++++ 
| 1 | Game 1 | A game description | 
| 2 | Game 2 | And another  | 
| 3 | Game 3 | And another  | 
| .. | ... |  ...   | 
++++++++++++++++++++++++++++++++++++ 

+++++++++++++++++++++++++++++++++++++++ 
|    GameReviews    | 
+++++++++++++++++++++++++++++++++++++++ 
| ID |GameID|   Review   | 
+++++++++++++++++++++++++++++++++++++++ 
| 1 | 1 |Review for game 1  | 
| 2 | 1 |Another review for game 1| 
| 3 | 1 |And another    | 
| .. | ... |   ...    | 
+++++++++++++++++++++++++++++++++++++++ 

选项1:

SELECT 
    Games.ID, 
    Games.Name, 
    Games.Description, 
    GameReviews.ID, 
    GameReviews.Review 
FROM 
    GameReviews 
LEFT JOIN 
    Games 
ON 
    Games.ID = GameReviews.GameID 
WHERE 
    Games.ID=? 

选项2:

SELECT 
    ID, 
    Name, 
    Description 
FROM 
    Games 
WHERE 
    ID=? 

然后 SELECT ID, 评论 FROM GameReviews WHERE GameID =?

很显然,查询1会更“简单”,因为它只需要编写更少的代码,另一个在数据库上似乎在逻辑上更“容易”,因为它只查询Games表一次。问题的关键在于什么时候真的在性能和效率方面存在差异?

回答

1

绝大多数时间选项1是要走的路。除非你有大量数据,否则两者之间的性能差异将无法衡量。把事情简单化。

你的例子也相当基础。在规模上,性能问题可以基于哪些字段被过滤,加入和拉取而开始显示。理想的情况是只提取索引中存在的数据(尤其是InnoDB)。这通常是不可能的,但一种策略是在最后时刻提取您需要的实际数据。这是什么选项2会做什么。

在极端规模下,您根本不想在数据库中进行任何连接。您的“连接”会在代码中发生,最大限度地减少通过网络发送的数据。去选择1,直到你开始有性能问题,这可能永远不会发生。

1

转到选项1,这正是RDBMSes的优化目标。
最好从客户端打一次数据库,而不是多次重复打一次数据库。

我不相信你永远不会有那么多的比赛,并回顾了它才有意义与选项去2.

+0

我希望我有时可以接受这两个答案... – SnareChops 2013-03-10 02:52:53