小编pla*_*rob的帖子

为什么这个update-with-join mysql查询这么慢?

我有一个应用程序需要更新层次结构中的节点,从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=?
Run Code Online (Sandbox Code Playgroud)

该表在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
Run Code Online (Sandbox Code Playgroud)

但为什么原始声明没有达到预期的效果,我怎么需要重新制定它才能更好地发挥作用?

根据要求,这是create table的缩写版本:

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` …
Run Code Online (Sandbox Code Playgroud)

mysql sql performance join

4
推荐指数
1
解决办法
3544
查看次数

标签 统计

join ×1

mysql ×1

performance ×1

sql ×1