所以我正在构建一个通知系统,其中可能有一百万个特定主题的订阅者(某些字符串)。比如说,百万订阅者希望收到主题“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将这么多数据存储在某个缓存中?使用这种缓存会有效吗?
另外,分页会有帮助吗???
我不是在寻找这里的确切解决方案,而是在以前解决过这类问题的人的想法。
答案 0 :(得分: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)
。
然后,查询的性能将基于返回的数据量。返回一百万行是很多行,因此这将是一个重要的性能考虑因素。