我有一个带有82117条记录的修改前预订树遍历(MPTT)表。这个mysql表包含一些地理数据(国家,州,地区,城市......)
{a.year:['2010', '2010', '2010', '2010', '2009'],
... and so on}
当我尝试使用标准的MPTT查询获取路径时出现问题:
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 ;
完成时间超过2.5秒。有什么问题?我错过了任何索引?这类数据结构的行太多了?或者查询中有任何错误?
注意:我注意到如果从查询中删除“ORDER BY”,查询时间会减少到0.05秒。
答案 0 :(得分:0)
您至少应该将查询转换为必须带来一些性能的正确JOIN
:
http://sqlfiddle.com/#!9/b4d7f8/3
SELECT p.name
FROM `geotree` AS node
INNER JOIN `geotree` AS p
ON node.lft BETWEEN p.lft AND p.rgt
WHERE node.rgt='$value'
由于您需要node.rgt='$value'
作为过滤器,我会添加索引KEY rgt (rgt)