MySQL LEFT JOIN与2个独立查询(性能)

时间:2013-03-09 20:01:35

标签: mysql performance

我有两张桌子:

++++++++++++++++++++++++++++++++++++
|              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=?

然后     选择         ID,         评论     从         GameReviews     哪里         游戏ID =?

显然,查询1将更“简单”,其中编写的代码较少,而另一个在逻辑上似乎在数据库上“更容易”,因为它只查询Games表一次。问题是,它真正归结为它在性能和效率方面确实存在差异吗?

2 个答案:

答案 0 :(得分:1)

使用选项1,这正是RDBMS优化的选项。
最好是从客户端点击一次数据库,而不是多次重复一次。

我不相信你会有这么多的游戏和评论,选择2会有意义。

答案 1 :(得分:1)

绝大部分时间选项1都是可行的方式。在您拥有大量数据之前,两者之间的性能差异无法衡量。保持简单。

你的例子也很基本。在规模上,性能问题可以根据过滤,连接和拉取的字段开始显示自己。理想情况是仅提取索引中存在的数据(特别是使用InnoDB)。这通常是不可能的,但策略是在最后可能的时刻提取您需要的实际数据。这是2将做什么选择。

在极端规模下,您根本不想在数据库中进行任何连接。您的“加入”将在代码中发生,从而最大限度地减少通过网络发送的数据。使用选项1,直到您开始出现可能永远不会发生的性能问题。