【问题标题】:Mysql inner join vs in clause performanceMysql 内连接 vs in 子句性能
【发布时间】:2017-12-28 07:03:57
【问题描述】:

我有一个查询来获取用户朋友的数据。我有 3 个表,一个是 user 表,第二个是 user_friend 表,它有 user_id 和friend_id(都是用户表的外键),第三个表是 feed 表,它有 user_id 和 feed 内容。饲料可以显示给朋友。我可以通过 join 或使用IN 子句以两种方式查询(我可以通过我用于网络的图形数据库获取所有朋友的 id)。

这里有两个查询:

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

在此查询中,我从图形数据库中获取朋友 ID,并将传递给此查询:

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

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

【问题讨论】:

  • 那个问题有子查询,我在 IN 子句中有实际值。我不需要查询表来获取值。但我在 IN 子句中有 1000 个值。
  • 它们是两个不同的查询。有什么更好的;锤子还是螺丝刀?

标签: mysql performance join in-clause


【解决方案1】:

使用合适的索引,单查询 JOIN(选择 1)几乎总是比 2 查询(选择 2)算法运行得更快。

要优化选项 1,b 需要此复合索引:INDEX(user_id, friend_id)。另外,a 需要一个以user_id 开头的索引(大概是PRIMARY KEY?)。

【讨论】:

    【解决方案2】:

    当您在子查询中有比较大数据时,这取决于您想要的结果,对于这种情况,它们总是首选连接。因为子查询可以比LEFT [OUTER] JOINS / INNER JOIN [LEft JOIN is faster than INNER JOIN],但在我看来,它们的优势在于可读性略高。

    因此,如果您的数据要比较的数据较少,那么您为什么选择完整的表连接,这取决于您拥有多少数据。

    在我看来,如果您在 IN 中的比较数据数量较少,那很好,但如果您有子查询或大数据,那么您必须选择 @987654322 @...

    【讨论】:

    • 我在 IN 子句中有实际价值。我不需要查询表来获取值。但我在 IN 子句中有 1000 个值。我没有任何子查询。
    • 如果这个计数等于表中的记录数那么你可以去IN否则使用JOIN
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2016-03-16
    • 2018-04-12
    相关资源
    最近更新 更多