优化基于分层数据的类别表
Posted
技术标签:
【中文标题】优化基于分层数据的类别表【英文标题】:Optimizing hierarchical data based category table 【发布时间】:2016-01-08 12:08:02 【问题描述】:我有一个基于本教程的分类表:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
表格的结构真的很简单:
id, lft, rgt
这是查询:
SELECT c . *, (COUNT(DISTINCT(parent.id))) AS level
FROM categories AS parent, categories AS c
WHERE c.lft
BETWEEN parent.lft
AND parent.rgt
GROUP BY c.id
ORDER BY c.lft
如您所见,同一张表被使用了两次。有一个 between 子句,它有 group by 和 order by。
我完全不确定应该如何优化它。
当对此使用 EXPLAIN 时,我得到:
Using index; Using temporary; Using filesort
【问题讨论】:
让我们看看整个EXPLAIN
。让我们看看SHOW CREATE TABLE
。运行这个:FLUSH STATUS; SELECT ...; SHOW SESSION STATUS LIKE 'Handler%';
并告诉我们表中有多少行以及结果集中有多少行。
【参考方案1】:
我建议您尝试使用 closure table 的方法 - 更简单的想法和更易读的查询。 您将需要一个 INSERT/UPDATE 触发器以及包含父母与其子女/孙子女/孙子女之间所有可能关系的闭包表...... 还包括节点本身(DEPTH = 0)
+-------------+----------+-------+
| ancestor_id | child_id | depth |
+-------------+----------+-------+
【讨论】:
以上是关于优化基于分层数据的类别表的主要内容,如果未能解决你的问题,请参考以下文章