mysql - 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 查询?
解决方案
假设 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 或任何你选择的选择和跳过选择。希望这对人有帮助:)
推荐阅读
- python - 如何使用特定格式的熊猫从文本文件中读取数据?
- javascript - 为什么分配给属性导致错误“无法设置空属性”
- ios - iOS Firebase Cloud Firestore 批处理() .addDocument()
- python - 无法使用 Python 填充 WPF DataGrid
- postgresql - 具有导出 C 符号和静态链接 libstd 的 Rust 库
- sql - 根据 SQL Server 中的条件分组重复
- c - 尝试编写在 C 中输出偶数的代码
- java - 无法从其他类添加到对象 ArrayList
- python - Pandas Dataframe 列将设置为字符串但不是整数
- ruby-on-rails - Rails:MiniMagick 无法生成带单引号的图像