【发布时间】:2011-05-24 15:49:56
【问题描述】:
我在理解在嵌套集模型上使用哪些索引时遇到了一些麻烦。查询是:
SELECT `node`.`id`,(COUNT(parent.id) - 1) AS `depth`,`name` FROM `categories` AS `parent`
INNER JOIN `categories` AS `node` ON (`node`.`lft` BETWEEN parent.lft AND parent.rgt)
INNER JOIN `filebank_categories` ON (`node`.`id` = `filebank_categories`.`category_id` AND `filebank_categories`.`filebank_id` = 136)
INNER JOIN `categories_names` ON (`categories_names`.`category_id` = `node`.`id` AND `categories_names`.`language_id` = 1)
WHERE `node`.`system_id` = parent.system_id
GROUP BY node.id
ORDER BY `node`.`lft` ASC
此查询耗时约 350 毫秒,categories 中有约 5000 行。 EXPLAIN 给出了这个:
表结构:
CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`system_id` int(11) DEFAULT NULL,
`lft` int(11) DEFAULT NULL,
`rgt` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `lft,category` (`lft`,`id`),
KEY `cat,lft,rgt` (`id`,`lft`,`rgt`),
KEY `system` (`system_id`),
CONSTRAINT `categories_ibfk_1` FOREIGN KEY (`system_id`) REFERENCES `systems` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11519 DEFAULT CHARSET=utf8;
任何想法如何改善这一点?甚至可能吗?我在数据库优化方面不是很有经验,所以我无法真正弄清楚在这里使用什么索引(以及为什么)。
谢谢。
【问题讨论】:
标签: mysql query-optimization nested-sets