我有两张桌子:
++++++++++++++++++++++++++++++++++++
| 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
表一次。问题是,它真正归结为它在性能和效率方面确实存在差异吗?
答案 0 :(得分:1)
使用选项1,这正是RDBMS优化的选项。
最好是从客户端点击一次数据库,而不是多次重复一次。
我不相信你会有这么多的游戏和评论,选择2会有意义。
答案 1 :(得分:1)
绝大部分时间选项1都是可行的方式。在您拥有大量数据之前,两者之间的性能差异无法衡量。保持简单。
你的例子也很基本。在规模上,性能问题可以根据过滤,连接和拉取的字段开始显示自己。理想情况是仅提取索引中存在的数据(特别是使用InnoDB)。这通常是不可能的,但策略是在最后可能的时刻提取您需要的实际数据。这是2将做什么选择。
在极端规模下,您根本不想在数据库中进行任何连接。您的“加入”将在代码中发生,从而最大限度地减少通过网络发送的数据。使用选项1,直到您开始出现可能永远不会发生的性能问题。