У меня есть таблица изменений обхода дерева подстроки (MPTT) с 82117 записями. Эта таблица MySQL содержит некоторые географические данные (Страна, Штат, регион, город ...)Как оптимизировать медленный Модифицированный запрос обхода дерева подзаголовка
CREATE TABLE IF NOT EXISTS `geotree` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`geo_id` int(11) DEFAULT NULL,
`name` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL,
`parent` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`,`lft`,`rgt`),
KEY `geo_id` (`geo_id`),
KEY `parent` (`parent`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=82174 ;
Проблема возникает, когда я пытаюсь получить путь, используя стандартный MPTT запрос следующим образом:
SELECT p.name
FROM `geotree` AS node, `geotree` AS p
WHERE node.lft BETWEEN p.lft AND p.rgt AND node.rgt='$value'
ORDER BY p.lft
Требуется больше 2,5 секунд. В чем проблема? Я пропустил какой-либо индекс? Слишком много строк для такого типа структуры данных? Или есть ошибка в запросе?
ПРИМЕЧАНИЕ. Я заметил, что если я удалю «ORDER BY» из запроса, время запроса уменьшится до 0,05 секунд.
К сожалению, в MySQL join не может использовать индексы для условий диапазона ('BETWEEN',' <','> ', ...). В этом случае время выполнения становится пропорциональным <количеству строк в таблице> * <количество строк с rgt = значение>. – Vatev