在这两个查询之间,MySQL5.7.19中一个比另一个快吗?
select {some columns}
from
table1 t1
join table2 t2 using ({some columns})
where t1.col1=1
与
select {some columns}
from
(select {some columns} from table1 where col1=1) t1
join table2 t2 using ({some columns})
假设所有索引都设置正确
2条答案
按热度按时间j2qf4p5b1#
我已经创建了一个sql fiddle以便我们可以进行实验。
您的第一个查询转换为:
执行计划是:
id select\ type表格类型可能的\键\长度参考行已额外筛选
1个简单t1参考id,col1 col1 4 const 2 100.00使用索引
1个简单t2参考表1\ id表1\ id 4 db\ U 9\ U 0005cd.t1.id 1 100.00使用索引
这几乎是尽可能快。
你的第二个问题变成
执行计划是:
id select\ type表格类型可能的\键\长度参考行已额外筛选
一级t2索引表1\ id表1\ id 4 3 100.00使用索引
1主要参考4 db\ U 9\ U 0005cd.t2.table1\ U id 2100.00
2使用索引导出表1 ref col1 col1 4 const 2 100.00
这里的区别是,您使用的是派生表,但它仍然使用索引。我的期望是,只要数据库不受资源限制,这个查询的执行速度将与版本1一样快——如果遇到内存或cpu限制,那么第二个查询的行为可能会更加不可预测。
然而。。。
理论上的方法不能代替有测试数据的测试环境,并在代表性的条件下调整这个东西。我怀疑你正在构建的真正的查询是否会像示例一样简单。。。
e4yzc0pl2#
对于这对简单的查询,涉及“派生表”(子查询)的查询肯定不会更快。
在其他情况下,派生表可以更快。这包括
GROUP BY
或者LIMIT
在执行操作之前减少行数JOIN
.