【发布时间】: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