【问题标题】:How to make my native query faster using indexing in Spring Data Jpa and postgres如何使用 Spring Data Jpa 和 postgres 中的索引使我的本机查询更快
【发布时间】:2020-11-10 12:53:48
【问题描述】:

我正在尝试使用 JPA 本机查询和 PostgreSQL 搜索包含数百万条记录的连接表,但结果太慢。我想在 postgres 上使用索引搜索或任何可以建议的更好的选项来使其更快。我在网上查了几篇这样的文章: https://hashrocket.com/blog/posts/exploring-postgres-gin-index

但我不太确定如何实现它,因为速度没有提高。

这是我的 JPA 存储库中的内容:

 @Query(value = "SELECT DISTINCT C.APPROVED_NAME AS companyName, C.CITY AS city, C.STATE AS state, 
FROM TABLE_NAME_1 C LEFT JOIN TABLE_NAME_2 AS A ON A.COMPANY_FK = C.ID 
WHERE CONCAT(UPPER(A.FIRSTNAME), ' ', UPPER(A.SURNAME))
 LIKE UPPER(concat(:searchTerm,'%')) ", nativeQuery = true)
    List<table_1_Interface> findByName(@Param("searchTerm") String searchTerm);

这是我尝试使用索引搜索做的事情(我是使用索引搜索的新手):

 @Query(value = "CREATE INDEX company_search_idx ON TABLE_NAME_2(firstname, surname );
SELECT DISTINCT C.APPROVED_NAME AS companyName, C.CITY AS city, C.STATE AS state, 
FROM TABLE_NAME_1 C LEFT JOIN TABLE_NAME_2 AS A ON A.COMPANY_FK = C.ID 
WHERE CONCAT(UPPER(A.FIRSTNAME), ' ', UPPER(A.SURNAME))
 LIKE UPPER(concat(:searchTerm,'%')) ", nativeQuery = true)
    List<table_1_Interface> findByName(@Param("searchTerm") String searchTerm);

请帮助我提出您的建议、想法和解决方案。

【问题讨论】:

  • 你是否在数据库级别添加了外键约束
  • 连接中的两个表都有外键关系。所以在外键约束可用的数据库上。但是我在尝试执行此索引时没有添加任何外键约束。
  • 相同的查询是否仅在 DB 端执行得更好?我的意思是如果你不通过 Java 执行它。
  • 不,它不会......它就像没有创建索引@sigur 一样慢
  • 我的意思是创建表时是否创建了外键约束@​​kingified

标签: java postgresql indexing spring-data-jpa


【解决方案1】:

如果您在 CONCAT(UPPER(A.FIRSTNAME), ' ', UPPER(A.SURNAME)) 上搜索,那么这就是需要构建索引的内容(但没有表别名)。但是对于 pg_trgm 它直接支持 ILIKE,所以你可以直接使用它而不是手动摆弄大小写。

由于您只在搜索词的末尾添加一个 %,因此您可以使用带有 text_pattern_ops 的 btree 索引。但是,您将需要带有 LIKE 的 UPPER。

【讨论】:

猜你喜欢
  • 2019-06-21
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多