Postgresql 祖先树宝石:通过外键确定记录范围以提高性能?
我正在使用ruby gem祖先模型来模拟一个“参考朋友”式的“向前支付”结构 在我的表中,我创建了许多不同的树,它们是外键event_id所独有的。每个event_id都有一个根节点,然后是它的后代 我目前有索引:Postgresql 祖先树宝石:通过外键确定记录范围以提高性能?,postgresql,ruby-on-rails-4,ancestry,Postgresql,Ruby On Rails 4,Ancestry,我正在使用ruby gem祖先模型来模拟一个“参考朋友”式的“向前支付”结构 在我的表中,我创建了许多不同的树,它们是外键event_id所独有的。每个event_id都有一个根节点,然后是它的后代 我目前有索引: add_index :promoters, :ancestry add_index :promoters, :event_id 简单 查询变得非常慢。。。查询第一个子级节点的时间超过350毫秒 我想知道是否最好创建一个新的索引,比如 add_index :promoters, [:
add_index :promoters, :ancestry
add_index :promoters, :event_id
简单
查询变得非常慢。。。查询第一个子级节点的时间超过350毫秒
我想知道是否最好创建一个新的索引,比如
add_index :promoters, [:event_id, :ancestry]
我的理解是,这可以极大地加快LIKE查询的速度,因为它可以首先将表缩减为事件id的记录
数据库是Heroku上的Postgres,Rails 4.1
谢谢,如果有其他更好的方法,请提出建议
编辑:添加有关LIKE查询的更多信息
查询一级节点:
ancestry = '22333433'
查询节点的所有子代:
ancestry LIKE '22333433/%'
gem基本上以字符串形式存储到节点的路径,用“/”之类的查询分隔节点的ID以到达该节点?祖先柱是什么样子的?这个gem是否碰巧使用了某种可移植的CSV-in-a-column怪物?另外,祖先生成什么样的SQL查询?如果希望优化这些内容,您需要了解SQL级别的工作方式。我添加了一些关于祖先列如何工作的更多信息您必须使用祖先吗?也许对SQL中的树进行一些研究,选择最适合您的使用模式的树,并注意希望使用递归CTE的表示,因为PostgreSQL支持这些表示。