MySQL INNER JOIN vs“WHERE id IN()”

时间:2014-03-03 10:30:42

标签: mysql join

我有一个文档权限表,我希望为用户选择一个文档页面。 事实是,可以允许用户通过多个组访问文档,因此我们可能会为用户提供超过X records for X documents的内容。

我尝试使用子查询进行分页,但MySQL不喜欢LIMIT in the subquery

我面临两个主要选择:

  1. SELECT perm.* FROM
    (SELECT DISTINCT document_id FROM permissions WHERE .... LIMIT...) ids
    INNER JOIN
    (SELECT fields FROM permissions WHERE ....) perms
    ON ids.document_id = perms.document_id
    
  2. 使用Java进行连接 - 首先阅读文档ID,然后在查询中使用它们:

    SELECT fields FROM permissions WHERE .... AND document_id IN([specific document_ids previously read])
    
  3. 什么会更有效?

1 个答案:

答案 0 :(得分:1)

您的问题中有一些不同的问题。首先:

1:我真的不明白你在查询中做了什么,但是limit子句必须在查询的末尾,所以你可以试试

select * from A join B on A.id = B.id limit 10

这应该有效。更多信息:

https://dev.mysql.com/doc/refman/5.0/en/select.html

2:Join vs. IN子句:IN子句应该总是比连接更差。想象一下:

select * from A where A.id in (select id from B)

这将对B表(select id from B子查询)进行全面扫描,然后对A进行另一次完整扫描以尝试匹配结果。

然而,

select * from A join B on A.id = B.id

应该在两个表之间进行散列连接,如果你已经计划好了,id将是一个索引列,所以它应该更快(并且不对它们都没有完全扫描)