我从另一台服务器上获取了多达1000个ID,以将其显示给访问者,因此我必须使用IN查询,例如:
SELECT * FROM `table` WHERE `id` IN (23221, 42422, 2342342....) // and so on, up to 1000
让我们说1/3的访客会观看,虽然所有1000个id都在观看,而其中2/3的访客只会观看前50个。
对性能/工作负载而言,哪个更好呢?一个查询所有1000个ID或将它们拆分为20个查询,每个查询50个ID?因此,当观看了前50个时,请查询下50个,等等。
编辑:
分割时不需要使用LIMIT,这意味着查询中的ID最多为50。那么更好的是,一次查询一次具有1000个ID的查询,还是20次查询每个50个ID的查询?
编辑:
好吧,我很快又直接问:一个查询中的1000个ID不太多吗?我在这里How to optimize an SQL query with many thousands of WHERE clauses读到,WHERE / OR不好吗? >
答案 0 :(得分:2)
让我们说1/3的访客会观看,虽然所有1000个id都在观看,而其中2/3的访客只会观看前50个。
由于您要假设访问者如何对待它,因此要优化您的响应。
对性能/工作负载而言,哪个更好呢?一个查询所有1000个ID或将它们拆分为20个查询,每个查询50个ID?因此,当观看了前50个时,请查询下50个,等等。
是的,您是正确的,应该限制返回响应。 这是如何实现您的要求的一个示例(我对mysql不太了解,但这是您可以获得期望结果的方法。)
SELECT * FROM `table` WHERE `id` IN (23221, 42422, 2342342....)
order by `id`
LIMIT 10 OFFSET 10
如果是SQL SERVER
:
create stored proc sp_SomeName
@id varchar(8000)
@skip int,
@take int
as
begin
SELECT * FROM some_table WHERE id IN (23221, 42422, 2342342....)
order by id
OFFSET @skip ROWS --if 0 then start selecting from 0
FETCH NEXT @take ROWS ONLY --if 10 then this is the max returning limit
end
上面的查询将执行的操作是:将获取发布的ID的所有数据,然后按ID升序排列。然后从他们的选择中,仅选择第一个10/50/100,下一次,它将选择下一个10/50/100或您采用的选择,然后跳过选择。希望这对男人有帮助:)
答案 1 :(得分:0)
您可以查看此处提供的答案: MySQL Data - Best way to implement paging?
使用LIMIT语句,您只能返回一部分结果。通过更改LIMIT语句中的参数,您可以重新使用查询。
要知道,除非您使用“ ORDER BY”,否则SQL Server并不总是返回相同的记录。换句话说,如果由于发生了更新而无法读取某条记录,而数据库服务器可以读取下一条记录,则它将获取下一条记录(尽快给出结果)。我不确定LIMIT是否会强制数据库服务器考虑某种顺序(我不太熟悉MySql)。