长期以来,被认为是替代MySQL,PostgreSQL。但在那个时候,有没有办法让他达到MySQL可能达到的水平。近年来,这些问题一直没有得到
解决,而且有很多有趣的
工具来弥补,我们用两个slony和pgbouncer在Disqus。slony允许我们拷贝数据(有时可以分割),和pgbouncer解决问题保持联系和
连接池。
同时,让我们在他们的
语言看:我很高兴这个星期能够学会如何在pgsql8.4使用递归
查询,他们太强大了。这是我真的想在这article.mysql大家讨论可以使我们的
工作和很好的工作,但你只能在
发动机结构做。虽然在PG仍然是这样,你有更多的选择。所以我想谈谈线索树。
我们都知道,Disqus不仅是最大的贾恩
网站(我们有近100万人次/月)。同时,他也是最大的在线评论
系统,我们为成千上万的网站提供了很多
功能,最基本的是树形结构的
提示。
PostgreSQL的线索提供了一些解决方案。最常用的(最有效的)
方法是先序遍历的改进版。总之,他增加了一个左,右的
顺序,他们将被更新,当你添加评论。我们也有另一个标准方法(Reddit很快乐),这是把一切在
内存中完成
操作。事实上,不只是只有Reddit做。
拿什么PGSQL为我们提供了一个看,我们也可以找到两个
选项(在8.4版中最小)。其中一个是内置在PG叫ltree模块。他允许你存储一个节点的完整
路径(所有父节点)和允许你查询的SQL语句的标准这将是非常有用的当你需要
排序第一的最早,因为它改变了一个简单的类ltree柱。然而,很多时候,DISQUS
情况并非如此简单。
我们的第二个解递归查询。我花了很长的时间来了解他,但当我明白,我深深的被他的能力所吸引。Postgre提供许多功能,MySQL没有的,如在()的改性剂。他们真的做得很好。
让我们继续深入到我们的问题,这将是一个大问题。现在,同样的方式
处理多
线程Disqus和Reddit等在线解决方案一样简单。我想说的是,这并不意味着代码是不好的,但他的
优化不做他应该做的直到有人(你,奥巴马学生)开始使用该
程序,每个人都想要回答他的话,我们
发现的问题。再次,我们认为Djan(即使他们越来越大),他们通过业务逻辑。
从8.4年初开始,我们就可以使用递归查询来解决这个问题。(在很多情况下,我们已经开始这样做了,虽然会有点复杂),这很简单。
我们给出一个基本的例子,我们有一个注释模型,看起来有点像这个。
创建表注释(
串行主键,
消息varchar,
作者varchar,
parent_id整数引用评论(ID)
);
插入评论(消息、作者、parent_id)
值(这个线程是真的很酷!!,'david,null),('ya戴维,我们,戴维,1),它也被称为'ya,戴维,是的,很酷的。
(非常有趣的帖子!,'thedz,null),(你的先生,是
错误的,'chris ',5),(','克',5);
我们现在所做的是建立一个基本的评价模型。我们的消息,我父亲的评论(这是可选的)。现在,让我们来
学习如何使用递归查询轻松排序在这个数据,通过ID升序。
递归CTE(ID信息,作者,路径,parent_id,深度为()
选择ID,
消息,
作者,
数组{ }作为路径,
parent_id,
1深度
从评论
在parent_id是空的
联盟的所有
选择comments.id,
comments.message,
comments.author,
cte.path comments.id | |,
comments.parent_id,
cte.depth + 1深度
从评论
加入CTE在comments.parent_id = cte.id
)
从CTE中选择id、消息、作者、路径、深度
按路径排序;
它是甜的,不是吗哦,等等,这令人费解吗因此,我一直在寻找更复杂的查询是一堆惊人的错误。
Pgexperts指出
正确的道路,我们。
现在,我不会得到太多,因为有一个更好的
教程来处理这个
模式中的递归查询,但是我们已经完成了我们的结果。
我们必须处理大量的信息,和一些评论有近几千个答复。如果99%评论只有100的回答,把他们的记忆是没有问题的,但当他们开始增加,我们会浪费很多时间。在pgsql递归查询允许我们简单的手这项工作对数据库(有时他们的过程比我们快得多),节省大量的时间和资源花在
网络通信和网络处理。
一个例子可以让你更直观地了解他是多么有效率。我们已经看到,只有在大型数据库SQL处理时间(返回25结果而不是1000),它几乎节省了500%的时间。这甚至不包括我们程序级别的成本。是的,是的,这些SQL语句的
速度是数据库层上其他数据库的5倍。
总之,作为一个MySQL的
支持者,我被震惊的
性能,尺寸,和Disqus使用PostgreSQL的灵活性。我期待着发现我们可以通过这个平台找到,仍在
等待我们的挑战。