gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:49:43 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com