【发布时间】:2012-08-24 15:49:11
【问题描述】:
我开发了一个提供非常通用的数据存储的网站。目前它工作得很好,但我正在考虑优化速度。
INSERT/SELECT 比率很难预测并且会因不同情况而变化,但通常 SELECT 更频繁。 INSERT 足够快。 SELECT 让我担心。有很多 LEFT JOIN。例如。每个对象都可以有一个图像,该图像存储在单独的表中(因为它可以跨越多个对象)并存储有关图像的其他信息。
每次选择最多进行 8 次连接,处理过程最多可能需要 1 秒 - 平均值约为 0.3 秒。每个请求可以有多个这样的选择。已经在 SQL 端进行了多次优化,没有太多可以做的。
除了为 DB 购买更强大的机器之外,还能做什么(如果有的话)?
在这里,Django 也不是速度恶魔,但我们仍然有一些优化。如果必须,切换到 PyPy。在 DB 方面,我有一些想法,但它们似乎并不常见 - 找不到任何真实案例。
- 为这部分使用不同的存储速度更快。我们需要事务,我们需要一致性检查,所以它可能不是可取的。
- 可搜索缓存?这里有意义吗?例如。维护以 NoSQL 或其他方式组合的所有表的平面副本。插入会更昂贵——如果一些常见的表发生变化,它需要更新 NoSQL 中的多条记录。也很难维护。
有什么是有意义的,或者它只是最快的,可以获得更多的 RAM,增加 rdbms 中的缓存大小,获得 SSD 并离开它。专注于优化其他部分,例如池化数据库连接,因为它们也很昂贵。
使用的技术:PostgreSQL 9.1 和 Django (python)。
总结一下。问题是:在优化了所有 SQL 部分 - 索引、集群等之后。当无法选择静态超时缓存结果时(不同的请求参数,不同的结果),可以做些什么来进一步优化。
---编辑 30-08-2012---
我们已经在每天检查慢查询。这是我们的瓶颈。我们只对索引进行排序和过滤。另外,很抱歉不清楚这一点 - 我们不会将实际图像存储在数据库中。只是文件路径。
JOIN 和 ORDER BY 正在扼杀我们的表现。例如。一个输出 20 000 个结果的复杂查询需要 1800 毫秒(使用了 EXPLAIN ANALYZE)。这假设我们没有使用任何基于 JOINed 表的过滤。
如果我们跳过所有的 JOINS,我们将缩短到 110 毫秒。这太疯狂了...这就是为什么我们正在考虑某种可搜索的缓存或平面副本 NoSQL。
在没有排序的情况下,我们得到了 60 毫秒,这很棒,但是 PostgreSQL 中的 JOIN 性能如何? 是否有一些不同的数据库可以为我们做得更好?最好是免费的。
【问题讨论】:
-
找到(并修复)你真正想到的瓶颈
-
通常的答案是 memcached,但您已经排除了这种可能性。如果您无法缓存,那么您需要让您的数据库更快或改进您的访问模式以减少往返、批处理等。
-
至少显示一些查询及其
explain analyze。人们甚至不看 SQL 就无法提高 SQL 性能。如果您最终遇到的复杂查询确实无法快速运行,但需要简单查询的响应时间,那么选择materialized views 可能会有很大帮助。 -
我问的不是优化 SQL。我在问当 SQL 已经优化时,除了购买新机器之外是否还有其他事情要做。您的链接很有用,并且现在最接近答案。我还没有听到具体化的观点——一定会去看看!谢谢!
-
仅仅因为您认为您的查询已优化并不意味着它们已优化。随意抛出一个查询,它通过explain.depesz.com在这里解释分析输出供我们查看。这很可能是 pg 专家所关注的东西,并且对如何修复有完全不同的想法。另外,您要加入多少张桌子?您对这些表的数据定义是什么样的?
标签: sql django postgresql caching optimization