提高sql select查询

时间:2015-10-11 15:48:01

标签: mysql sql hibernate query-optimization

所以我正在构建一个通知系统,其中可能有一百万个特定主题的订阅者(某些字符串)。比如说,百万订阅者希望收到主题“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将这么多数据存储在某个缓存中?使用这种缓存会有效吗?

另外,分页会有帮助吗???

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

1 个答案:

答案 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)

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