我根本不是 SQL 专家:) 存在非常关键的性能问题。 这是与问题直接相关的信息。
我的数据库中有 2 个表 - 表 condos
和表 goods
。
表condos
具有字段:
- ID(PK)
- 姓名
- 城市
- 国家
表项:
- ID(PK)
- 姓名
- 多个与问题无关的字段
- condo_id(FK)
我在 condos
表中有 1000 多个实体,在 items
表中有 1000 多个实体。
问题是我如何执行项目搜索
目前是:
例如,我想获取city = Sydney
的所有项目
- 执行
SELECT Condos.condo_id FROM public.condos WHERE city = 'Sydney'
- 为第 1 步中获得的每个
condo_id
创建一个SELECT * FROM public.items WHERE item.condo_id = ?
。
问题是,一旦我在 condos
表中获取 1000 多个实体,对于属于“Sydney”的每个 condo_id
,请求将执行 1000 多次。并且该请求的执行时间超过 2 分钟,这是一个关键的性能问题。
所以,问题是:
执行此类搜索的最佳方式是什么?我应该在单个 WHERE
请求中放入 1000 多个 id 吗?或者?
对于添加信息,我使用 PostgreSQL 9.4 和 Spring MVC。
最佳答案
使用表join
来执行查询,这样您就不需要执行额外的查询。在您的情况下,您可以通过 condo_id
加入 condos
和 items
,如下所示:
SELECT i.*
FROM public.items i join public.condos c on i.condo_id = c.condo_id
WHERE c.city = 'Sydney'
请注意,性能调整是一个讨论主题。它可能因环境而异,取决于您如何构建表中的数据以及如何在代码中组织数据。
以下是一些可能也有帮助的其他建议:
尝试为使用排序和搜索的字段添加索引,例如condos
中的 city
和 items
中的 condo_id
。有个好的answer解释索引如何工作。
我还建议您执行EXPLAIN
来为您的查询设计一个查询计划,是否存在可能导致性能问题的全表搜索。
希望这能有所帮助。
关于java - PostgreSQL 多个 'WHERE' 条件(1000+)请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38289226/