mysql - 针对多个相似选择查询的 Hibernate 性能调优

标签 mysql sql performance hibernate jpa

我遇到的问题是我批量中有很多类似的查询:

select id, a, b, c from records where a = 1 and b = 2
select id, a, b, c from records where a = 5 and b = 3
select id, a, b, c from records where a = 2 and b = 5
select id, a, b, c from records where a = 3 and b = 4
...

一个批处理通常由 1000 个查询组成,大约需要 0.5 秒才能完成,其中 a 和 b 都有索引。自动提交已打开,所有连接都在boncp连接池中管理。 Hibernate 用于将每个结果映射到一个对象实例。

我的问题是:
1.如果我将它们组合在一个查询中,即使所有数据库连接都是事件的并且服务不需要等待连接建立,会有什么不同吗?
2. 如果是,在 hibernate 状态下执行此操作的最佳实践是什么?
3. 如果不是,尽管连接池只允许同时执行一定数量的查询,但如果我同时执行所有查询(而不是在当前情况下一个一个地执行),会有什么不同吗?

最佳答案

Hibernate 提供了一些在加载关联实体(BATCH、JOIN、SUBSELECT)时优化获取检索的策略,但对于 HQL/JPQL,您最多只能生成使用 native 查询完成的查询。

  1. 您需要禁用自动提交。这与 Hibernate 后写事务处理效果不佳,而且还会影响性能。

  2. 由于您使用的是 MySQL,因此您可以尝试创建一个 IN query像这样:

    select id, a, b, c 
    from records 
    where (a, b) IN ((1, 2), (5, 3), (2, 5), (3, 4))
    
  3. 如果您对获取实体(用于更新/删除它们)不感兴趣并且只需要一个投影(id、a、b、c),那么 native 查询是比 HQL 查询更好的选择(假设 MySQLDialect 甚至支持此语法)。

  4. 我不会同时执行这些操作。 CP 锁争用将成为您的下一个瓶颈,对于仅索引扫描,单个 IN 查询将比许多小查询执行得更好。

关于mysql - 针对多个相似选择查询的 Hibernate 性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24947569/

相关文章:

java - 任何与时间戳一起使用的高性能 Java 库?

android - 应用程序在 Android 4.2.2 上运行完美,但在 4.4.4 上则不行

javascript - 为什么 MySQL 在闪族语言的字符串中添加单双引号

sql - 使用 PostgreSQL 修剪尾随空格

c# - 处理输入验证的专业/首选方式是什么

sql - A left outer join B 如何返回比 A 中更多的行?

Java 字符串与 StringBuilder

mysql - 重新抛出非 MySQL 错误 Node.js

php - 我正在使用 Chrome,无法使用 php 从 mysql 获取图像显示

php - 从搜索框中获取内容在数据库中查找它