У меня есть приложение, которое должно обновлять узлы в иерархической структуре, вверх от определенного узла, чей идентификатор известен. Я использую следующее заявление MySQL, чтобы сделать это:Почему этот запрос update-with-join 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=?
Таблица имеет первичный ключ идентификатор, а индексы на МВТ и РТГ. Заявление работает, но я обнаружил, что у него были проблемы с производительностью. Если посмотреть на результаты EXPLAIN для соответствующего оператора select, я увидел, что количество строк, проверенных для таблицы «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
Я не пытался добавить составной индекс (на самом деле, у меня нет уровня доступа, необходимый, чтобы сделать это на месте); но я не понимаю, как это поможет, пытаясь понять, как механизм базы данных попытается решить двойственное неравенство.
Это поможет, если вам может опубликовать как определения таблиц, так и объяснение ... –
Можете ли вы опубликовать оператор 'CREATE TABLE' и вывод' EXPLAIN? –
BTW: условие 'A.lft <= B.lft и A.rgt> = B.rgt' истинно для 'A == B'. Это намеченное поведение? – wildplasser