【问题标题】:Improving performance for sql select query提高 sql 选择查询的性能
【发布时间】:2016-01-09 02:13:33
【问题描述】:

所以我正在构建一个通知系统,其中可以有数百万个特定主题(一些字符串)的订阅者。假设百万订阅者希望收到主题“abc”的通知。

现在我们将数百万订阅者的数据存储在 mysql 数据库中。

所以对于主题“abc”,我想检索这个百万订阅者的列表。

我在这里使用 Hibernate 作为我的 ORM。所以为了选择订阅者列表,我正在做一个选择

select * from Subscription AS sub INNER JOIN Topic AS t ON sub.topicId = t.topicId 
INNER JOIN Subscriber AS sr ON sub.subscriberId= sr.subscriberId  
WHERE t.topic = 'abc' 

考虑到我的数据库中有数百万订阅者,这将扫描数百万行。我相信查询需要很长时间才能执行。

我在我的 DAO(使用 Spring JPA)中检索列表

List<Subscription>subList = subRepository.findByTopicName(eventBean.getTopic())

我希望尽快填充我的结果集,因为我的想法是实时发送通知。

考虑到上述前提,以这种方式调用数据库并考虑到数百万行是否会提供所需的性能?我的猜测是没有。

如何优化我的查询以及如何检索它以实现实时性能??

我知道使用索引会提高性能,但我知道如何一次检索所有这些数据。 Hibernate 是否可以将这么多数据存储在某个缓存中?使用这种缓存会有效吗??

另外,分页在这里有帮助吗???

我不是在这里寻找确切的解决方案,而只是从以前解决过此类问题的人那里获得的想法。

【问题讨论】:

  • 我建议您逐步扩展您的应用程序。现在构建和设计一些东西来处理数百万用户可能还为时过早。确保您可以首先处理成千上万的用户。然后,如果您到达那里,请进行调整以处理数十万,然后是数百万。我认为当您达到数百万时,您可能需要考虑使用 PubSub 系统而不是 SQL。现在,您可以按原样处理查询 - 只需确保您的 id 和外键已编入索引。

标签: mysql sql hibernate query-optimization


【解决方案1】:

对于这个查询:

select *
from Subscription AS sub INNER JOIN
     Topic AS t
     ON sub.topicId = t.topicId INNER JOIN
     Subscriber AS sr
     ON sub.subscriberId = sr.subscriberId  
WHERE t.topic = 'abc' ;

您需要以下索引:Topic(topic, topicId)、Subscription(topicId, sub, subsriberId) 和 Subscriber(subsriberId)。

查询的性能将取决于返回的数据量。返回一百万行是很多行,因此这将是一个重要的性能考虑因素。

【讨论】:

  • 另一个相对简单的优化是根据总行数选择驱动表。如果 Subscription 的行数多于主题,如果您 SELECT * FROM Topic 然后进行连接,您最终将在查询执行中扫描更少的行。
  • @AlVaz 。 . .根据topic 的选择性,在某些情况下这可能是更好的方法。
  • 是的,Alvaz,主题总是少于订阅。感谢您提出这个建议……但仍有 1 个主题可以匹配数百万订阅者。还有什么其他方法可以提高优化。最重要的是mysql将如何传输这一百万行数据以及hibernate将如何存储它......我认为在这些地方,性能也会受到影响..
猜你喜欢
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多