mysql - 哪个查询有更好的性能?
问题描述
我有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)
查询必须使用参数集检查条目中是否存在记录。
假设参数集如下:
- 班级名称:班级#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
当然还有一个额外的条件来检查我没有在查询中包含的代码。
我想知道哪一个在大规模生产环境中表现更好。假设类中有 100 行,主体有 10000 行,“条目”中有超过 250000 行,并且必须为每个请求执行查询(如解释),并且至少有 3000 个用户在系统上不断地同时工作。
- 这些查询中的哪一个会执行得更好,为什么?原因对于进一步的工作非常重要
- 有没有比这两种方法更好的方法来编写查询,或者甚至更好的方法来构造模式?
问候
PS:我已经阅读过这个关于比较子查询和连接的问题,但我的问题并不完全是一个简单的比较
解决方案
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
. 然后我可以就索引提出建议。
推荐阅读
- apache-kafka - 有没有办法在不使用 Message 键的情况下将消息发布到 kafka 中的特定分区?
- sql - 比较 SQL 案例语句中的 3 个变量
- c# - 如何在 .Net core 2.1 的渐进式 Web 应用程序中存储数据?
- javascript - 使用 vis.js 从 json 文件中填充节点和链接
- android - 如何在应用更新中为 android 配置灵活或立即发布?
- python - 有没有办法通过只知道href来点击按钮?没有 id 或 value 可以清楚地区分。在 python 中使用 Selenium
- asp.net - 通过控制输入的值
- javascript - 在函数参数中传递用户定义的类型
- azure - 有没有办法在创建 Azure 容器实例时设置没有值的环境变量?
- azure - 在arm模板中传递除参数文件之外的其他参数