MySQL中父行的递归更新

MySQL中父行的递归更新,mysql,recursion,Mysql,Recursion,我有一个如上定义的表。字段'parent_id'引用行的父级,因此整个数据看起来像n元树 根据我的业务逻辑,当一行的字段“count”被请求增加(例如,增加1)时,所有的祖先节点(或行)都应该被更新,以将“count”字段也增加1 由于这个“count”字段预计会频繁更新(比如1000/秒),我相信由于DBMS中的巨大级联写入操作,这个递归更新会大大降低整个系统的速度 目前,我认为存储过程是我可以选择的最佳选择。如果MySQL支持Oracle的“连接方式”这样的操作,可能会有一些棘手的方法,但显

我有一个如上定义的表。字段'parent_id'引用行的父级,因此整个数据看起来像n元树

根据我的业务逻辑,当一行的字段“count”被请求增加(例如,增加1)时,所有的祖先节点(或行)都应该被更新,以将“count”字段也增加1

由于这个“count”字段预计会频繁更新(比如1000/秒),我相信由于DBMS中的巨大级联写入操作,这个递归更新会大大降低整个系统的速度

目前,我认为存储过程是我可以选择的最佳选择。如果MySQL支持Oracle的“连接方式”这样的操作,可能会有一些棘手的方法,但显然不是这样

有什么有效的方法来实现这一点吗


提前感谢。

当您使用存储过程时,仍然需要递归。您只需将递归从源代码移动到数据库

您可以使用来存储分层数据。基本上,您可以创建两个附加字段
left
right
,其中
left
。然后,节点
e1
是节点
e2
iff
e1.left>e2.left&&e1.right
的从属节点


这以较高的节点插入、删除和重新定位成本为代价消除了递归。另一方面,像您描述的那样,节点内容的更新可以在单个查询中完成。这是有效的,因为索引可以用于在单个查询中检索节点及其所有祖先。

使用存储过程时,仍然需要递归。您只需将递归从源代码移动到数据库

您可以使用来存储分层数据。基本上,您可以创建两个附加字段
left
right
,其中
left
。然后,节点
e1
是节点
e2
iff
e1.left>e2.left&&e1.right
的从属节点


这以较高的节点插入、删除和重新定位成本为代价消除了递归。另一方面,像您描述的那样,节点内容的更新可以在单个查询中完成。这是有效的,因为索引可用于在单个查询中检索节点及其所有祖先。

如果您更频繁地写入读取,则不应更新父节点。而只是在读取时进行计算?如果将数据结构更改为,这将有助于SELECT中的计算。@user730685请使用
{}
按钮输入源代码。如果这次你这么做了。@cmmi这应该是一个答案,而不是一个评论。也许,如果你经常写阅读,你不应该更新家长。而只是在读取时进行计算?如果将数据结构更改为,这将有助于SELECT中的计算。@user730685请使用
{}
按钮输入源代码。如果这次你这么做了。@cmmi这应该是一个答案而不是一个评论。
CREATE TABLE record (
  id INT PRIMARY KEY,
  parent_id INT,
  count INT NOT NULL
)