当前位置: 首页 > 知识库问答 >
问题:

Mysql内部联接与in子句性能的关系

司寇烨伟
2023-03-14

我有一个查询,以获得用户的朋友的数据。我有三个表,一个是user表,第二个是user_friend表,它有user_id和friend_id(都是user表的外键),第三个表是feed表,它有user_id和feed内容。饲料可以给朋友看。我可以通过两种方式查询,要么通过join查询,要么通过使用in子句查询(我可以通过graph数据库获取所有朋友的ID,我正在使用它进行网络连接)。

以下是两个查询:

SELECT
  a.*
FROM feed a
INNER JOIN user_friend b ON a.user_id = b.friend_id
WHERE b.user_id = 1;

在这个查询中,我从graph数据库中获取朋友ID,并将其传递给这个查询:

SELECT
 a.*
FROM feed a
WHERE a.user_id IN (2,3,4,5)

当我有数百万条记录时,哪个查询运行得更快,性能更好?

共有1个答案

濮俊美
2023-03-14

有了合适的索引,单查询join(Choice1)几乎总是比2查询(Choice 2)算法运行得快。

为了优化选择1,b需要这个复合索引:index(user_id,friend_id)。此外,需要一个索引(大概是主键?)从user_id开始。

 类似资料:
  • 问题内容: 对于这些查询,我可以获得相同的结果,但是哪一个是最快,最有效的? in()或内部联接在哪里? 和 问题答案: 取决于您的SQL引擎。具有合理查询优化器的较新SQL系统很可能会将两个查询重写为同一计划。通常,使用联接(第一个查询)重写子查询(第二个查询)。 在可能没有出色查询优化器的简单SQL引擎中,联接应该更快,因为它们可能在运行外部查询之前将子查询运行到临时内存表中。 但是,在某些内

  • 问题内容: 这个问题已经在这里有了答案 : 等于(=)和IN的性能差异(带一个文字值) (7个答案) 2年前关闭。 这是一个非常简单的问题,我假设答案是“没关系”,但无论如何我都必须问… 我有一个用PHP构建的通用sql语句: 假设进行了先期有效性检查(一个数组至少包含1个项目且所有数值都是),我应该改为执行以下操作吗? 还是检查的开销不值得在实际的sql语句中保存(如果有的话)? 问题答案: 两

  • 问题内容: 我不知道是什么问题。使用MySQL 5.0尝试运行以下MYSQL更新语句时出现编译错误 所有字段名称都是正确的。有什么想法吗? 问题答案: 尝试这个: 更新: 既然您说查询产生了语法错误,所以我创建了一些可以对其进行测试的表,并确认查询中没有语法错误: 看到?没有语法错误。我针对MySQL 5.5.8进行了测试。

  • 问题内容: 这个问题已经在这里有了答案 : 显式与隐式SQL连接 (12个答案) 6年前关闭。 之间的性能(在mysql中)是否有差异 和 ? 问题答案: 从问题44917的公认答案中得出: 在性能方面,它们是完全相同的(至少在SQL Server中是这样),但请注意,它们已弃用隐式外部联接语法。 在MySql中,结果是相同的。 我个人会坚持使用明确的联接表……这是“社会上可以接受的”方法。

  • 本文向大家介绍MySQL XOR运算符与IN子句?,包括了MySQL XOR运算符与IN子句?的使用技巧和注意事项,需要的朋友参考一下 如果一个或另一个操作数(或表达式)但不是两个都为TRUE,则MySQL XOR返回TRUE。IN子句用于指定任何其他MySQL查询的条件。 让我们先创建一个表 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 输出结果 这将产生以下输出-

  • 问题内容: 我分两个步骤运行MYSQL查询。首先,通过一个查询获取ID列表,然后使用第二个查询沿的方式检索这些ID的数据。我知道这听起来很骇人听闻,但是由于查询非常复杂,我已经这样做了。第一个涉及许多几何和触发法,第二个涉及许多不同的联接。我确定它们可以在单个查询中编写,但是我的MYSQL不足以实现它。 这种方法有效,但是 感觉 不对。再加上我担心它不会扩展。目前,我正在10,000个记录的数据库