在这两个查询之间,是否比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})
假设所有索引都已正确设置
答案 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 BY
或LIMIT
在执行JOIN
之前减少行数的情况。