首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在PostgreSQL中处理大表之间的连接?

如何在PostgreSQL中处理大表之间的连接?
EN

Stack Overflow用户
提问于 2012-07-10 04:38:12
回答 1查看 6.8K关注 0票数 1

我有两个表: urls (表中有索引页,host是索引列,30mln行) hosts (表中有关于主机的信息,host是索引列,1mln行)

我的应用程序中最常见的选择之一是:

代码语言:javascript
运行
复制
SELECT urls.* FROM urls
JOIN hosts ON urls.host = hosts.host
WHERE urls.projects_id = ?
    AND hosts.is_spam IS NULL
ORDER by urls.id DESC, LIMIT ?

在urls表中有超过100000行的项目中,查询执行得非常慢。

由于表不断增长,查询的执行速度越来越慢。我读过很多关于NoSQL数据库(如MongoDB)的资料,这些数据库是为处理这么大的表而设计的,但是将我的数据库从PgSQL改为MongoDB对我来说是个大问题。现在我想试着优化PgSQL解决方案。你对此有什么建议吗?我该怎么办?

EN

回答 1

Stack Overflow用户

发布于 2012-07-10 05:05:59

此查询与所提供的索引相结合应该是快速的:

代码语言:javascript
运行
复制
CREATE INDEX hosts_host_idx ON hosts (host)
WHERE is_spam IS NULL;

CREATE INDEX urls_projects_id_idx ON urls (projects_id, id DESC);

SELECT *
FROM   urls u
WHERE  u.projects_id = ?
AND    EXISTS (
    SELECT 1
    FROM   hosts h USING (host)
    WHERE  h.is_spam IS NULL
    )
ORDER  BY urls.id DESC
LIMIT  ?;

索引是更重要的成分。您所拥有的连接语法可能也同样快。请注意,第一个索引是一个partial index,第二个索引是在第二列上具有DESC顺序的multicolumn index

这在很大程度上取决于您的数据分布的具体情况,您必须(像往常一样)使用EXPLAIN ANALYZE进行测试,以了解性能以及是否使用了索引。

General advice about performance optimization也适用。你知道该怎么做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11402742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档