将巨大的 select 查询拆分成多个部分是否有意义?
Does it make sense to split a huge select query into parts?
其实是做高负载服务的公司的面试题。
例如,我们有一个 table,其中包含 1TB 的记录和主 b 树索引。
我们需要 select 5000 到 5000000 范围内的所有记录。
我们不能阻止整个数据库。数据库处于高负载状态。
将巨大的 select 查询拆分成
这样的部分是否有意义
select * from a where id > =5000 and id < 10000;
select * from a where id >= 10000 and id < 15000;
...
请帮我比较一下我们使用 Postgres 和 MySQL 时的行为。
select 所有必需的记录是否有其他最佳技术?
谢谢。
你的问题有很多未知数。首先,什么是table结构?此查询是否会使用任何 indexes ?
找出答案的最佳方法是运行一个执行计划并分析性能。
但是尝试一次检索这么多行似乎不太合理。该查询很可能会导致服务器负载过重 + RAM 消耗 + 可能使用临时文件。它可能会失败或超时。
然后结果集必须通过网络传输,而且它可能会很大。您必须评估数据集的大小,如果不深入了解 table 结构,我们无法猜测。
最大的问题是,为什么要检索这么多行,最终目标是什么?假设您有一个带有 datagridview 或类似东西的 GUI 应用程序。您不会一次显示 5 亿行,这会使应用程序崩溃。用户可能想要的是 分页 或使用某些过滤器搜索记录。也许你一次最多显示几百条记录。
你打算用这些记录做什么?
其实是做高负载服务的公司的面试题。 例如,我们有一个 table,其中包含 1TB 的记录和主 b 树索引。 我们需要 select 5000 到 5000000 范围内的所有记录。 我们不能阻止整个数据库。数据库处于高负载状态。 将巨大的 select 查询拆分成
这样的部分是否有意义select * from a where id > =5000 and id < 10000;
select * from a where id >= 10000 and id < 15000;
...
请帮我比较一下我们使用 Postgres 和 MySQL 时的行为。 select 所有必需的记录是否有其他最佳技术?
谢谢。
你的问题有很多未知数。首先,什么是table结构?此查询是否会使用任何 indexes ?
找出答案的最佳方法是运行一个执行计划并分析性能。
但是尝试一次检索这么多行似乎不太合理。该查询很可能会导致服务器负载过重 + RAM 消耗 + 可能使用临时文件。它可能会失败或超时。
然后结果集必须通过网络传输,而且它可能会很大。您必须评估数据集的大小,如果不深入了解 table 结构,我们无法猜测。
最大的问题是,为什么要检索这么多行,最终目标是什么?假设您有一个带有 datagridview 或类似东西的 GUI 应用程序。您不会一次显示 5 亿行,这会使应用程序崩溃。用户可能想要的是 分页 或使用某些过滤器搜索记录。也许你一次最多显示几百条记录。
你打算用这些记录做什么?