0

所以我有两张桌子,一张叫user,一张叫user_favoriteuser_favorite存储一个itemIdand userId,用于存储用户收藏的项目。我只是试图找到没有记录的用户user_favorite,所以我可以找到那些还没有收藏任何内容的用户。

出于测试目的,我有 6001 条记录user和6001 条记录user_favorite,所以只有一条记录没有收藏夹。

这是我的查询:

  SELECT u.* FROM user u
   JOIN user_favorite fav ON u.id != fav.userId
   ORDER BY id DESC

这里id最后一条语句中的 没有歧义,它指的是user表中的 id。我有一个 PK 索引u.id和一个fav.userId.

当我运行此查询时,我的计算机变得无响应并完全冻结,没有给出任何输出。我有 2gb 的 RAM,不是一台很棒的计算机,但我认为它应该能够轻松地处理带有 6k 条记录的查询。

这两个表都在 MyISAM 中,这可能是问题吗?切换到 INNODB 会修复它吗?

4

3 回答 3

3

让我们首先讨论您的查询(如书面)在做什么。由于 != 在 on 子句中,您将每个用户记录与每个其他用户的收藏夹一起加入。因此,您的查询将产生类似 36M 行的内容。这不会给你想要的答案。它解释了为什么你的电脑不开心。

你应该如何编写查询?您可以使用三种主要模式。我认为这是一个很好的解释:http ://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/并专门讨论了性能mysql的上下文。它向您展示了如何查看和阅读执行计划,这对于优化查询至关重要。

于 2013-07-14T06:21:22.310 回答
1

将您的查询更改为以下内容:

select * from User 
where not exists (select * from user_favorite where User.id = user_favorite.userId)

让我知道事情的后续

于 2013-07-14T06:19:10.807 回答
1

加入A != B意味着 A 的每条记录都与 B 的每条记录相连,其中 id 不相等。

换句话说,不是生成 6000 行,而是生成大约 3600 万 (6000 * 6001) 行输出,所有这些都必须被收集,然后排序......

于 2013-07-14T06:19:48.453 回答