我有一个应用程序需要从 ID 已知的特定节点向上更新分层结构中的节点。我使用以下 MySQL 语句来执行此操作:
update node as A
join node as B
on A.lft<=B.lft and A.rgt>=B.rgt
set A.count=A.count+1 where B.id=?
该表在 id 上有一个主键,在 lft 和 rgt 上有一个索引。该语句有效,但我发现它存在性能问题。查看相应 select 语句的 EXPLAIN 结果,我看到为“B”表检查的行数非常大(可能是整个表)。
我可以轻松地将查询分成两个单独的查询:
select lft, rgt from node where id=?
LFT=result.lft
RGT=result.rgt
update node set count=count+1 where lft<=LFT and rgt>=RGT
但是为什么原始语句没有按预期执行,我需要如何重新制定它才能更好地工作?
根据要求,这是创建表的缩写版本:
CREATE TABLE `node` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`lft` decimal(64,0) NOT NULL,
`rgt` decimal(64,0) NOT NULL,
`count` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `location` (`location`(255)),
KEY `lft` (`lft`),
KEY `rgt` (`rgt`),
) ENGINE=InnoDB
我没有尝试添加复合索引(实际上,我没有当场执行此操作所需的访问级别);但我看不出它有什么帮助,试图思考数据库引擎将如何尝试解决双重不等式。