我有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
当然还有检查代码的附加条件,我没有在查询中包括它。
我想知道哪个在大规模生产环境中表现更好。假设类中有100行,主体中有10000行,“ entry”中有超过250000行,并且必须为每个请求执行查询(如所解释的),并且至少有3000个用户在任何时间连续且同时在系统上工作。 / p>
致谢
PS:我已经读过this question有关比较子查询和联接的信息,但是我的问题并不完全是简单的比较
答案 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
。然后,我可以建议您建立索引。