因此,我正在构建一个通知系统,其中一个特定主题(某个字符串)可以有数百万订阅者。假设有一百万订阅者想要接收主题"abc“的通知。
现在,我们在mysql数据库中存储数百万订阅者的数据。
因此,对于主题"abc“,我想检索这个百万订阅者的列表。
我在这里使用Hibernate作为我的ORM。因此,为了选择订阅者列表,我执行了select
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有可能在某些缓存中存储如此多的数据吗?使用这种缓存是否有效??
另外,分页在这里会有帮助吗?
我在这里并不是在寻找精确的解决方案,而只是从以前解决过这类问题的人那里寻求想法。
发布于 2015-10-11 23:52:43
对于此查询:
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)。
然后,查询的性能将基于返回的数据量。返回一百万行是很大的行数,因此这将是一个重要的性能考虑因素。
https://stackoverflow.com/questions/33066903
复制相似问题