首页 > 解决方案 > SQL IN 查询性能 - 是否更好地拆分它

问题描述

我从另一台服务器获得多达 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 的一个查询或每个 50 个 id 有 20 个查询更好的是什么?

编辑:

好的,我更直接地问它:一个查询中的 1000 个 id 不是太多吗?我在这里读过如何使用成千上万个WHERE/OR 都不好的 WHERE 子句来优化 SQL 查询?

标签: mysqlsqlperformance

解决方案


假设 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 或任何你选择的选择和跳过选择。希望这对人有帮助:)


推荐阅读