mysql查询性能比较

baubqpgj  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(327)

在这两个查询之间,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})

假设所有索引都设置正确

j2qf4p5b

j2qf4p5b1#

我已经创建了一个sql fiddle以便我们可以进行实验。
您的第一个查询转换为:

select *  
from
  table1 t1
  join table2 t2 on t2.table1_id = t1.id
  where t1.col1=1

执行计划是:
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使用索引
这几乎是尽可能快。
你的第二个问题变成

select *
from
  (select * from table1 where col1=1) as t1
  join table2 t2 on t2.table1_id = t1.id

执行计划是:
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限制,那么第二个查询的行为可能会更加不可预测。
然而。。。
理论上的方法不能代替有测试数据的测试环境,并在代表性的条件下调整这个东西。我怀疑你正在构建的真正的查询是否会像示例一样简单。。。

e4yzc0pl

e4yzc0pl2#

对于这对简单的查询,涉及“派生表”(子查询)的查询肯定不会更快。
在其他情况下,派生表可以更快。这包括 GROUP BY 或者 LIMIT 在执行操作之前减少行数 JOIN .

相关问题