哪个查询性能更好?

Which query has better performance?

我有 3 个表如下:

class
  id:bigint(PK)
  name:varchar


principal:
  id: bigint(PK)
  pid:bigint
  flag:boolean
  uniqueConstraint(pid, flag)

entry:
  cid: (FK, reference class)
  pid: (FK, refernce principal)
  object_id: bigint
  code: tinyint
  PK: (cid, pid, obj)

查询必须使用参数集检查条目中是否存在记录。

假设参数设置如下:

我写了 2 个查询,一个使用 join,一个使用 sub-query:

查询编号1:

select id from entry where pid in
    (select id from principal
         where (pid=2 AND role)
            OR (pid=3 AND !role)
    )
    AND cid = (select id from class where name='Class#3')
    AND object_id=45

并查询号码2:

select e.id from class c
            inner join entry e on e.cid=c.id and c.name='Class#3'
            inner join principal p on p.id=e.pid 
                     and p.id in ( select id from principal
                         where (pid=2 AND role)
                            OR (pid=3 AND !role)
                                 )
    where e.object_id=45

当然还有一个检查代码的附加条件,我没有将其包含在查询中。

我想知道哪个在大规模生产环境中表现更好。假设 class 中有 100 行,原则上有 10000 行,'entry' 中有超过 250000 行,并且必须为每个请求执行查询(如所解释的),并且至少有 3000 个用户在系统上不断工作并且随时同时进行。

  1. 这些查询中哪些查询的性能更好,为什么?原因是这样 对进一步的工作很重要
  2. 有没有比这两种方法更好的方法来编写查询 或者更好的方法来构建模式?

此致


PS: 我读过this question关于比较子查询和连接,但我的问题不完全是一个简单的比较

IN ( SELECT ... ) 通常效率低下。

OR 通常效率低下。

JOINs 通常比其他表达方式更有效。

这个

     where (pid=2 AND role)
        OR (pid=3 AND !role)

这样可能会更快:

     where pid IN (2,3)
       AND ((pid=2 AND role)
         OR (pid=3 AND !role)
           )

如果可以有效地使用索引来限制在 之前 OR.

撒尿 2 和 3 的努力,则可能会出现加速

试试别人的评论和我的建议,加上CREATETABLE和EXPLAIN。然后我可以就索引提出建议。