【问题标题】:Efficiency of multiple equality tests vs joins in MySQLMySQL 中多个相等测试与连接的效率
【发布时间】:2011-05-18 21:12:08
【问题描述】:

假设我想根据与该内容关联的 user_id 从内容表中查询数据 - 但我想获取多个用户的内容。

SELECT field1, field2, ... fieldn
FROM content
WHERE user_id=1 OR user_id=2 OR ...

在我看来,这是相对有效的……在某种程度上。假设content 表有 >200k 记录,我对来自 50 个特定用户的记录感兴趣。像下面这样的查询仍然有效吗?

SELECT field1, field2, ... fieldn
FROM content
WHERE user_id=1 OR ... OR user_id=50

我正在考虑创建一个 users_group 表,如下所示:

CREATE TABLE users_group (
  group_id int(11),
  user_id int(11),
  primary_key(group_id,user_id)
);

...并用软件感兴趣的用户组填充它。

然后我可以这样查询:

SELECT field1, field2, ... fieldn
FROM content c
INNER JOIN users_group ug ON c.user_id=ug.user_id
WHERE ug.group_id=1

这样会更有效率吗?

【问题讨论】:

    标签: mysql join performance


    【解决方案1】:

    或者,更简单的事情:

    SELECT field1, field2, ... fieldn
     FROM content
     WHERE user_id IN (1,2,3,4,5,6,7...50)
    

    以这种方式从 PHP 之类的东西构建为动态 SQL 非常简单。

    • 补充说:另外,相当不错,直到您获得> 1000个左右的项目。您还必须注意 MAX_PACKET,但对于该范围内的事情,这是最简单/最快的方法。

    【讨论】:

    • 这只是句法变化,优化器会将其视为一系列 OR 语句
    • 同意。这是他的问题的一个糟糕的答案。我认为正确的答案是“这更有效”。数据库必须以某种方式获取这些信息,并且提供速度会更快。但归根结底,假设索引工作正常,两者都不会对 200K 记录产生重大影响。
    【解决方案2】:

    我认为很难说它是否会更快,数据库最终仍然必须做同样的工作,但使用连接算法可能比使用索引搜索更有效,您必须对其进行基准测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      相关资源
      最近更新 更多