java - PostgreSQL 多个 'WHERE' 条件(1000+)请求

标签 java database postgresql performance spring-mvc

我根本不是 SQL 专家:) 存在非常关键的性能问题。 这是与问题直接相关的信息。

我的数据库中有 2 个表 - 表 condos 和表 goods

condos具有字段:

  • ID(PK)
  • 姓名
  • 城市
  • 国家

表项:

  • ID(PK)
  • 姓名
  • 多个与问题无关的字段
  • condo_id(FK)

我在 condos 表中有 1000 多个实体,在 items 表中有 1000 多个实体。

问题是我如何执行项目搜索

目前是:

例如,我想获取city = Sydney的所有项目

  1. 执行 SELECT Condos.condo_id FROM public.condos WHERE city = 'Sydney'
  2. 为第 1 步中获得的每个 condo_id 创建一个 SELECT * FROM public.items WHERE item.condo_id = ?

问题是,一旦我在 condos 表中获取 1000 多个实体,对于属于“Sydney”的每个 condo_id ,请求将执行 1000 多次。并且该请求的执行时间超过 2 分钟,这是一个关键的性能问题。

所以,问题是:

执行此类搜索的最佳方式是什么?我应该在单个 WHERE 请求中放入 1000 多个 id 吗?或者?

对于添加信息,我使用 PostgreSQL 9.4Spring MVC

最佳答案

使用表join来执行查询,这样您就不需要执行额外的查询。在您的情况下,您可以通过 condo_id 加入 condositems,如下所示:

SELECT i.* 
FROM public.items i join public.condos c on i.condo_id = c.condo_id 
WHERE c.city = 'Sydney'  

请注意,性能调整是一个讨论主题。它可能因环境而异,取决于您如何构建表中的数据以及如何在代码中组织数据。

以下是一些可能也有帮助的其他建议:

尝试为使用排序和搜索的字段添加索引,例如condos 中的 cityitems 中的 condo_id。有个好的answer解释索引如何工作。

我还建议您执行EXPLAIN来为您的查询设计一个查询计划,是否存在可能导致性能问题的全表搜索。

希望这能有所帮助。

关于java - PostgreSQL 多个 'WHERE' 条件(1000+)请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38289226/

相关文章:

java - 将 @Transactional 添加到 Testcase 会导致数据库中的实体不持久

java - 从 Java 到 Kotlin

database - 从数据库行在 Golang 中创建 map

sql - 如何根据 ActiveRecord 中的条件在每第 n 个项目中插入?

python - Django 导入带回车的 CSV

mysql - 在 SQL 中将特定字符串设为大写

java - 如何读取同样使用 bouncycaSTLe 在 DER 中编码的 PKCS8 加密私钥?

java - 优化网络图形绘制

mysql - 对于以国家和部门为特色的基于运动队的数据库,这是正确的数据库结构吗?

oracle - 分开存储元数据和原始数据