MySQL查询性能比较

时间:2018-06-14 09:50:46

标签: mysql performance

在这两个查询之间,是否比MySQL 5.7.19中的另一个更快?

select {some columns}
from
  table1 t1
  join table2 t2 using ({some columns})
where t1.col1=1

VS

select {some columns}
from
  (select {some columns} from table1 where col1=1) t1
  join table2 t2 using ({some columns})

假设所有索引都已正确设置

2 个答案:

答案 0 :(得分:2)

我创建了SQL Fiddle,因此我们可以进行实验。

您的第一个查询转换为:

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

执行计划是:

  

id select_type表类型possible_keys键key_len引用行过滤额外

     

1 SIMPLE t1 ref id,col1 col1 4 const 2   100.00使用索引

     

1 SIMPLE t2 ref table1_id table1_id 4 db_9_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表类型possible_keys键key_len引用行过滤额外

     

1 PRIMARY t2 index table1_id table1_id 4 3 100.00使用索引

     

1 PRIMARY ref 4 db_9_0005cd.t2.table1_id 2100.00

     

2 DERIVED table1 ref col1 col1 4 const 2 100.00使用索引

这里的区别在于您使用的是派生表,但它仍在使用索引。我的期望是,只要数据库没有资源限制,这将与版本1一样快速执行 - 如果你遇到内存或CPU限制,第二个查询的行为可能会稍微不可预测。

...然而

理论方法无法替代具有测试数据的测试环境,并在具有代表性的条件下调整此事。我怀疑你正在构建的真实查询将像示例一样简单......

答案 1 :(得分:0)

对于那对简单的查询,涉及"派生表" (子查询),肯定不会更快。

在某些情况下,派生表可以更快。这包括GROUP BYLIMIT在执行JOIN之前减少行数的情况。