[英]SQL IN Query performance - better split it or not
我从另一台服务器获取了多达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是否不是太多? 我在这里阅读了如何使用成千上万个 WHERE / OR不好的数千个WHERE子句来优化SQL查询 ?
假设有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或您采用的选择,然后跳过选择。 希望这对男人有帮助:)
您可以查看此处提供的答案: MySQL数据-实现分页的最佳方法?
使用LIMIT语句,您只能返回结果的一部分。 通过更改LIMIT语句中的参数,您可以重新使用查询。
要知道,除非您使用“ ORDER BY”,否则SQL Server并不总是返回相同的记录。 换句话说,如果由于发生了更新而无法读取某条记录,而数据库服务器可以读取下一条记录,则它将获取下一条记录(尽快给出结果)。 我不确定LIMIT是否会强制数据库服务器考虑某种顺序(我对MySql不太熟悉)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.