我正在查看一些性能查询并对查询进行了更改,该查询基于以下示例。这个变化将一个6分钟的查询变成了一个在几秒钟内完成的查询,我想知道为什么?这种情况如何改变到这种程度?
在示例中,请假设BOOK表包含库中所有书籍的一般详细信息,FORMATS表包含详细信息,例如HARDBACK,PAPERBACK和eBOOK(允许添加新格式)密钥(称为FORMATID)链接两个表。
查询在6分钟内执行
select b.bookid, f.formatname
from book b
inner join formats f on f.formatid = b.formatid
select b.bookid, f.formatname
from book b
left join formats f on f.formatid = b.formatid
查询在12秒内执行
select b.bookid, (select f.formatname from formats f where f.formatid = b.formatid)
from book b
where b.formatid is not null
select b.bookid, (select f.formatname from formats f where f.formatid = b.formatid)
from book b
在上面,每对的第一个查询实现了INNER JOIN结果,第二个查询实现了LEFT JOIN。我的数据库的结果差异是295166和295376行;关系差异几乎保持不变。
[已添加]确认;我已经通过创建这里提到的两个测试表来测试了这个(具有相同的结果),用大约100万行填充BOOKS表并且不应用任何索引或其他优化。