我有3张桌子。股票有很多新闻文章和新闻文章可以参考1个或多个股票。这是使用Stock表,News表和Stock_News表建模的。
如何获得我提供的30个股票代码的最新新闻文章?什么指数会使这个效率最高?
我的新闻表包含id
,link
,published_at
。 (在published_at,id主键上的索引)
我的股票表格有id
,symbol
。 (符号索引,id主键)
我的stock_news表格有stock_id
news_id
。 (每个单独和组合的索引)
目前我正在使用,但我想知道这是否是最佳方式
SELECT n.link, s.symbol, n.published_at FROM news n
JOIN stock_news sn on n.id = sn.news_id
JOIN stocks s on s.id = sn.stock_id where s.symbol in ('AAPL', 'GOOG' ... etc)
ORDER BY n.published_at DESC;
某些演示数据的EXPLAIN查询显示:
Sort (cost=8.92..8.92 rows=1 width=115)
Sort Key: n.published_at DESC
-> Nested Loop (cost=3.50..8.92 rows=1 width=115)
-> Hash Join (cost=3.45..7.51 rows=1 width=12)
Hash Cond: (s.id = sn.stock_id)
-> Seq Scan on stocks s (cost=0.00..4.05 rows=2 width=12)
Filter: ((symbol)::text = ANY ('{AAPL,GOOG}'::text[]))
-> Hash (cost=2.67..2.67 rows=223 width=16)
-> Seq Scan on stock_news sn (cost=0.00..2.67 rows=223 width=16)
-> Index Scan using news_pkey on news n (cost=0.05..1.40 rows=1 width=119)
Index Cond: (id = sn.news_id)
答案 0 :(得分:1)
如果您想要最新的,我会推荐distinct on
:
SELECT DISTINCT ON (s.symbol) n.link, s.symbol, n.published_at
FROM news n JOIN
stock_news sn
ON n.id = sn.news_id JOIN
stocks s
ON s.id = sn.stock_id
WHERE s.symbol IN ('AAPL', 'GOOG' ... etc)
ORDER BY s.symbol, n.published_at DESC;
对于性能,您需要索引:stocks(symbol, id)
,stock_news(stock_id, new_id)
和news(id)
。