我有两个表: urls (表中有索引页,host是索引列,30mln行) hosts (表中有关于主机的信息,host是索引列,1mln行)
我的应用程序中最常见的选择之一是:
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解决方案。你对此有什么建议吗?我该怎么办?
发布于 2012-07-10 05:05:59
此查询与所提供的索引相结合应该是快速的:
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也适用。你知道该怎么做。
https://stackoverflow.com/questions/11402742
复制相似问题