哪个查询具有更好的性能?

时间:2020-04-13 10:52:07

标签: mysql query-performance mysql-5.7

我有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)

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

假设参数集如下:

  • 班级名称:Class#3
  • 用户的主要ID:3
  • 主要身份作为角色:2
  • 对象ID:45

我写了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

当然还有检查代码的附加条件,我没有在查询中包括它。

我想知道哪个在大规模生产环境中表现更好。假设类中有100行,主体中有10000行,“ entry”中有超过250000行,并且必须为每个请求执行查询(如所解释的),并且至少有3000个用户在任何时间连续且同时在系统上工作。 / p>

  1. 这些查询中哪个会表现更好?为什么?原因是这样 对于后续工作很重要
  2. 是否有比这两种方法更好的方法来编写查询 甚至更好的方法来构建模式?

致谢


PS:我已经读过this question有关比较子查询和联接的信息,但是我的问题并不完全是简单的比较

1 个答案:

答案 0 :(得分:1)

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)
           )

如果可以有效地使用索引来限制在{em {1}}之前发怒2和3的努力,则可能会加快速度。

尝试其他人评论的内容和我的建议,并提供OR表和CREATE。然后,我可以建议您建立索引。