gpt4 book ai didi

java - SQL 速度慢,需要帮助。我应该走进内存吗?

转载 作者:行者123 更新时间:2023-11-29 12:16:36 28 4
gpt4 key购买 nike

我最近开发了一个应用程序(java 8、spring-boot、hibernate、maven),它通过 REST API 公开数据库。我遇到的问题是数据库调用很慢(3000 毫秒以上),只是为了获取一行。

我的表如下所示:(6m 行,210Mb,InnoDB,MySQL)

 Row    |  Type   |   length

id | int | 10

start | int | 10

end | int | 10

rec_id | int | 11 - primary key

我的sql是:

WHERE start < x AND end > x

但在 Hibernate 约定中:

BlocksEntity findByStartLessThanAndEndGreaterThan(int start, int end)

其中开始和结束是相同的值

我知道这个 BETWEEN (对于 Hibernate 来说,> 和 <)可能是一个非常昂贵的操作。因此,由于这太慢了,我开始查看内存表:

  • 我只需要从数据库中读取数据,而不需要对其进行更新
  • 数据库中的数据几乎不会改变,我们可能每月讨论一次

继续这里的最佳方法是什么?我真的需要它尽可能地响应,因为它将内容传递到一个快速超时的网页。我考虑过缓存,但由于我将在用户端点上缓存结果,因此这里的任何缓存都不会被命中。此外,键 (x) 太独特而无法缓存,很可能不会被命中。

我还读过其他表格,但这个表格是最有问题的。任何帮助和建议将不胜感激。

最佳答案

在(开始,结束)上添加复合索引将解决您的问题。

您的表大小很大(600万行),但是查看您没有文本字段的列,因此在我看来,只需添加索引即可解决您的问题,特别是您没有频繁更新,因此您的索引统计信息永远是最新的。

我建议将 ehcache 与 hibernate 一起使用来缓存实体,但在这种情况下,我认为您不需要它。在其他情况下您可能需要它。

如果索引没有帮助(我认为不会出现这种情况),那么可能是由于索引基数所致。我不认为你的数据案例只是指向这一点。

需要考虑的其他事项:

  • 由于您的数据主要用于读取,因此如果情况还不是这样,我建议您使用 MyISAM 引擎而不是 InnoDB。
  • 最后,我不知道 findByStartLessThanAndEndGreaterThan SQL 输出是什么,但我建议您在 hibernate 配置中将 show_sql 设置为 true 并检查生成的真实 SQL。在此基础上,如果需要,您可以使用更好的 HQL 查询

关于java - SQL 速度慢,需要帮助。我应该走进内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29704676/

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