如何优化慢速修改预订树遍历查询

时间:2015-11-30 19:35:00

标签: mysql data-structures mptt

我有一个带有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秒。

1 个答案:

答案 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)