【问题标题】:Slow SQL, need assistance. should I go in memory?SQL慢,需要帮助。我应该进入记忆吗?
【发布时间】: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


【解决方案1】:

在 (start, end) 上添加复合索引将解决您的问题。

您的表很大(6m 行),但是查看没有文本字段的列,所以在我看来,只需添加索引,您的问题就会得到解决,尤其是您没有频繁更新,因此您的索引统计信息将永远是最新的。

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

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

要考虑的其他事项:

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

【讨论】:

  • 600 万行并不是“巨大的”。这几乎是平均水平;)
  • 感谢您的有用回复,根据我在 Web 应用程序和数据库调优方面的小规模经验,我会认为它是巨大的。
  • 其实,我想在上面的 ehcache 语句中添加一条评论。阅读它我认为它给人的印象是建议在类似情况下使用 ehcache。好吧,通常我们将它用于很少更改的小型实体,而不是上述情况。所以最好将它与 Hibernate 一起使用,但我会用它来缓存小表
  • 嗯,这就是 ORM 的问题,它认为 O 比 R 更重要,而事实恰恰相反 :) 我不为此专门使用 Hibernate。另一方面,JooQ 允许您在 RDBMS 中充分利用 R,不需要缓存:p RDBMS 为您完成所有工作
  • 我没有看 JooQ 但肯定会看。公平地说,上面的问题不是休眠的,显然是缺少索引,所以即使他尝试运行本机 SQL,他的 qry 也会很慢。这就是为什么我提到他提取了hibernate生成的查询。如果他有数据库知识,他会解释 qry 并找到瓶颈,即:如果数据不适合内存,则将其写入磁盘或完成全表扫描(这是他的情况,因为没有索引)。我并不是说 hibernate 有时不会让你发疯,但在这种情况下,hibernate 是无辜的;)
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2015-07-30
  • 2016-02-11
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多