当您只选择最后一个N时,查询是否会遍历所有数据?

问题描述:

我有一个查询,从我的数据库中选择最后5($新)项目。当您只选择最后一个N时,查询是否会遍历所有数据?

 SELECT OvenRunData.dataId AS id, OvenRunData.data AS data 
    FROM ovenRuns INNER JOIN OvenRunData ON OvenRuns.id = OvenRunData.ovenRunId 
    WHERE OvenRunData.ovenRunId = (SELECT MAX(id) FROM OvenRuns) 
    ORDER BY id DESC LIMIT '$new' 

我想用AJAX请求执行这个查询每5秒,所以我可以更新我的表。 我知道这个查询选择最后5条记录,但我想知道查询是否遍历所有记录,然后选择最后5条,还是只选择最后5条而不检查所有数据?

我真的很担心我会有滞后。

+0

答案取决于表格的结构和可用的索引。通过适当的索引,不应该有全表扫描。试一试,看看你自己。 – dasblinkenlight

需要两个指标,使其足够快:

create index ix_OvenRuns_id on OvenRuns(id) 
create index ix_OvenRunData_ovenRunId on OvenRunData(ovenRunId) 

你甚至可以把OvenRunData.dataIdOvenRunData.data到第二个,或者创建clustered index,但是,这些指标肯定是避免全数据扫描。

这取决于索引。

就你而言,你应该有一个OverRuns(id)

这里更多:http://use-the-index-luke.com/sql/partial-results/top-n-queries

LIMITORDER BY后应用,并且ORDER BY被应用到整个结果集。所以你的问题的答案是,是的,在应用LIMIT之前,它必须经过WHERE条款确定的结果集中的所有记录。