当您只选择最后一个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条而不检查所有数据?
我真的很担心我会有滞后。
答
需要两个指标,使其足够快:
create index ix_OvenRuns_id on OvenRuns(id)
create index ix_OvenRunData_ovenRunId on OvenRunData(ovenRunId)
你甚至可以把OvenRunData.dataId
OvenRunData.data
到第二个,或者创建clustered index,但是,这些指标肯定是避免全数据扫描。
答
这取决于索引。
就你而言,你应该有一个OverRuns(id)
。
这里更多:http://use-the-index-luke.com/sql/partial-results/top-n-queries
答
的LIMIT
是ORDER BY
后应用,并且ORDER BY
被应用到整个结果集。所以你的问题的答案是,是的,在应用LIMIT
之前,它必须经过WHERE
条款确定的结果集中的所有记录。
答案取决于表格的结构和可用的索引。通过适当的索引,不应该有全表扫描。试一试,看看你自己。 – dasblinkenlight