【发布时间】:2015-06-24 15:04:15
【问题描述】:
我最近启动了一个应用程序(java 8、spring-boot、hibernate、maven),它通过 rest api 公开数据库。我遇到的问题是数据库调用很慢(3000 ms+)只是为了获得一行。
我的表如下所示:(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)
start 和 end 的值相同
我知道这个 BETWEEN(对于 Hibernate 来说是 > 和
- 我只需要从数据库中读取,而不需要对其进行更新
- 数据库中的数据几乎没有变化,我们可能每月讨论一次
在这里进行的最佳方式是什么?我真的需要它尽可能地响应,因为它将向一个快速超时的网页提供内容。我考虑过缓存,但由于我将在用户端点上缓存结果,所以这里的任何缓存都不会被命中。此外,键 (x) 太独特而无法缓存,很可能不会被命中。
我还阅读了其他表格,但这个表格是最有问题的。任何帮助和建议将不胜感激。
【问题讨论】:
-
你有索引吗?你根本没有提到这个词......
-
将表的内容移动到内存中,然后对内存中的表而不是数据库进行查询。这将提高性能。并且不要使用 Hibernate 的二级缓存,因为这将首先查询数据库。
-
@AlexK。不,不幸的是,表上没有索引。我希望有,但它不是我的数据。
-
所以你不能加他们?或者导入到有它们的数据库中?
-
@LuiggiMendoza 你将如何实现这个?将启动时的数据从 csv 或直接从数据库加载到地图或对象列表中,然后在那里搜索行?或者类似内存 H2 数据库的东西?
标签: java mysql hibernate caching