哪个查询性能更好?
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)
查询必须使用参数集检查条目中是否存在记录。
假设参数设置如下:
- class的姓名:Class#3
- 作为用户的主体 ID:3
- 作为角色的主体 ID: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
当然还有一个检查代码的附加条件,我没有将其包含在查询中。
我想知道哪个在大规模生产环境中表现更好。假设 class 中有 100 行,原则上有 10000 行,'entry' 中有超过 250000 行,并且必须为每个请求执行查询(如所解释的),并且至少有 3000 个用户在系统上不断工作并且随时同时进行。
- 这些查询中哪些查询的性能更好,为什么?原因是这样
对进一步的工作很重要
- 有没有比这两种方法更好的方法来编写查询
或者更好的方法来构建模式?
此致
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 的努力,则可能会出现加速
试试别人的评论和我的建议,加上CREATE
TABLE和EXPLAIN
。然后我可以就索引提出建议。
我有 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的姓名:Class#3
- 作为用户的主体 ID:3
- 作为角色的主体 ID: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
当然还有一个检查代码的附加条件,我没有将其包含在查询中。
我想知道哪个在大规模生产环境中表现更好。假设 class 中有 100 行,原则上有 10000 行,'entry' 中有超过 250000 行,并且必须为每个请求执行查询(如所解释的),并且至少有 3000 个用户在系统上不断工作并且随时同时进行。
- 这些查询中哪些查询的性能更好,为什么?原因是这样 对进一步的工作很重要
- 有没有比这两种方法更好的方法来编写查询 或者更好的方法来构建模式?
此致
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
.
试试别人的评论和我的建议,加上CREATE
TABLE和EXPLAIN
。然后我可以就索引提出建议。